{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对应 `tf.keras` 的01~02章节"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T08:03:35.947423Z",
     "start_time": "2025-01-14T08:03:29.081766Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.0\n",
      "torch 2.5.1+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "data": {
      "text/plain": "784"
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "28*28"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:30.417590400Z",
     "start_time": "2024-07-17T03:06:30.410095400Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据准备"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# tensor是可以看作是多维数组的泛化形式，是标量、向量和矩阵的更高维扩展，预处理中必不可少"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T08:16:06.281193Z",
     "start_time": "2025-01-14T08:16:06.249135Z"
    }
   },
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(), # 转换为tensor，进行归一化\n",
    "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差\n",
    "])\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "outputs": [],
   "execution_count": 11
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-14T08:16:08.451765Z",
     "start_time": "2025-01-14T08:16:08.449186Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torchvision.datasets.mnist.FashionMNIST"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 12
  },
  {
   "cell_type": "code",
   "source": [
    "len(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-14T08:10:16.563211Z",
     "start_time": "2025-01-14T08:10:16.559761Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60000"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds[0])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-14T08:16:15.040974Z",
     "start_time": "2025-01-14T08:16:15.037974Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 13
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T08:16:18.671924Z",
     "start_time": "2025-01-14T08:16:18.635277Z"
    }
   },
   "source": [
    "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
    "img, label = train_ds[0]\n",
    "img.shape\n",
    "# img.shape = (1, 28, 28)，这是因为通道数在最前面"
   ],
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "'Image' object has no attribute 'shape'",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mAttributeError\u001B[0m                            Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[14], line 3\u001B[0m\n\u001B[0;32m      1\u001B[0m \u001B[38;5;66;03m# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\u001B[39;00m\n\u001B[0;32m      2\u001B[0m img, label \u001B[38;5;241m=\u001B[39m train_ds[\u001B[38;5;241m0\u001B[39m]\n\u001B[1;32m----> 3\u001B[0m \u001B[43mimg\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mshape\u001B[49m\n\u001B[0;32m      4\u001B[0m \u001B[38;5;66;03m# img.shape = (1, 28, 28)，这是因为通道数在最前面\u001B[39;00m\n",
      "\u001B[1;31mAttributeError\u001B[0m: 'Image' object has no attribute 'shape'"
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T08:16:31.733705Z",
     "start_time": "2025-01-14T08:16:31.729732Z"
    }
   },
   "cell_type": "code",
   "source": "type(img) #tensor中文是 张量,和numpy的ndarray类似",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PIL.Image.Image"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "code",
   "source": "img[0]",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-14T08:13:38.479618Z",
     "start_time": "2025-01-14T08:13:38.475341Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510, 0.2863, 0.0000,\n",
       "         0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0039,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333, 0.4980, 0.2431,\n",
       "         0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118, 0.0157, 0.0000, 0.0000,\n",
       "         0.0118],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000, 0.6902, 0.5255,\n",
       "         0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000, 0.0000, 0.0471, 0.0392,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255, 0.8118, 0.6980,\n",
       "         0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902, 0.3020, 0.5098, 0.2824,\n",
       "         0.0588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745, 0.8549, 0.8471,\n",
       "         0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725, 0.5529, 0.3451, 0.6745,\n",
       "         0.2588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098, 0.9137, 0.8980,\n",
       "         0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980, 0.4824, 0.7686, 0.8980,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471, 0.8745, 0.8941,\n",
       "         0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667, 0.8745, 0.9608, 0.6784,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549, 0.8353, 0.7765,\n",
       "         0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745, 0.8627, 0.9529, 0.7922,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314, 0.8549, 0.7529,\n",
       "         0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314, 0.8863, 0.7725, 0.8196,\n",
       "         0.2039],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627, 0.8549, 0.7961,\n",
       "         0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627, 0.9608, 0.4667, 0.6549,\n",
       "         0.2196],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020, 0.8941, 0.9412,\n",
       "         0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510, 0.8510, 0.8196, 0.3608,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745, 0.8706, 0.8588,\n",
       "         0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431, 0.8549, 1.0000, 0.3020,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667, 0.8549, 0.8157,\n",
       "         0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431, 0.8784, 0.9569, 0.6235,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196, 0.7412,\n",
       "         0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039, 0.8275, 0.9020,\n",
       "         0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725, 0.9137, 0.9333, 0.8431,\n",
       "         0.0000],\n",
       "        [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157, 0.8000,\n",
       "         0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569, 0.8078, 0.8745,\n",
       "         1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275, 0.8627, 0.9098, 0.9647,\n",
       "         0.0000],\n",
       "        [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392, 0.8039,\n",
       "         0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000, 0.8980, 0.8667,\n",
       "         0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196, 0.8706, 0.8941, 0.8824,\n",
       "         0.0000],\n",
       "        [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176, 0.9765,\n",
       "         0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863, 0.4157, 0.4588,\n",
       "         0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745, 0.8745, 0.8784, 0.8980,\n",
       "         0.1137],\n",
       "        [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824, 0.8471,\n",
       "         0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647, 0.8902, 0.9608,\n",
       "         0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706, 0.8627, 0.8667, 0.9020,\n",
       "         0.2627],\n",
       "        [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451, 0.7608,\n",
       "         0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255, 0.8824, 0.8471,\n",
       "         0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745, 0.7098, 0.8039, 0.8078,\n",
       "         0.4510],\n",
       "        [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686, 0.8000,\n",
       "         0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686, 0.7608, 0.7490,\n",
       "         0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118, 0.6549, 0.6941, 0.8235,\n",
       "         0.3608],\n",
       "        [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745, 0.6863,\n",
       "         0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765, 0.8000, 0.8196,\n",
       "         0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608, 0.7529, 0.8471, 0.6667,\n",
       "         0.0000],\n",
       "        [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294, 0.9373,\n",
       "         0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569, 0.7490, 0.7020,\n",
       "         0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588, 0.3882, 0.2275, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569, 0.2392,\n",
       "         0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T08:16:50.708516Z",
     "start_time": "2025-01-14T08:16:50.682030Z"
    }
   },
   "cell_type": "code",
   "source": "img",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<PIL.Image.Image image mode=L size=28x28>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACS0lEQVR4AWKgA2BkYOD1ZGBgZAHZxcjIAKZBbBBm+quS8v3rj1N/GBiZGP8wMKNIMv91cnnCzuU65+X/vww8/76hSP5iMFVgZtpp2HXm8nUz02PHGUHGQTHjf9cugd//GE7f+cUo8ft0yDSEJCMDw/8TCgyMf34x/Ph3/vYfT0VphLH/GRgY3kt+Z2fl+cH5z8aSSWwHqmsZuJiZvn18p/CPkYnr7z9ZBiaofQwMjMwMPFI/frH++sr/j537K9sldhOE5H9mhnBJJg4Gbtlf7L//cQhvusaCkGT5xXDlBxsXl6rSD2Yunr9PoraeYAGZx8T4+x/DHwaGbV+/s/1/zczxm+H3P2a9jwxMDMz///z6+Y+BwW7ime9v//z78/XrXw6GbwxsX4NAYc3AICSlJhmk/oPpN+czVjbhX1zHeOz+fWR9qcnIYNkkKvCX+cMfrl+M36+HneEVVGC4x/v5GycPHxcj83GpP3+/MTB/Z2DgF0lwy3z24/49VeFfrLxsf+UBY0xqv8vDw87Ayv/4mSiTRACHIrexMdMvJjYGRlYLlpeP+X485mHje/eQ5/uPP+svKwj9+vD77y/Wf4xsaixP/z/mFvnw5jULOysHL9Mbza+P37O/+f3nN6fERwOWC+sTn937wcPGwcb88+//by/+/WX5wfPrw4fffxRfMjIweBWLv/7wl5mNhZnxPysrGysjA+NLBrZ/EpfCGJn+MTA4tYnxMzGz/GV8+f/pvy/MDP9/f2Paff0YJBAYGBg0RN/LPPx1Fx5HFDIAaCTYdiCc4RIAAAAASUVORK5CYII=",
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAcABwBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+tbw1oNx4m8QWmkWx2yXD4LkZCADJJ+gFbviL4a63oc7COE3MW4hdn38duD976jNc9daDqllIsc9lKrMu4YGeMkdR7gj8KzcV7H8BtEvV16+1iWCeG1Wz8mOV02pIzupwCeuAp6Z98cZ90aIzLIlw0c0ZJ4KgjHoeOa+evjS9n/wnMcNxBPCYLKONFhA2FNzMpGenDcgd816V4K03wefC+m3NlpVhP+5QSXBiR5fMx825iMg5zwce3FdbOzTwgW90lu6uCm8eYrL02soIyCPQgggEdMGQ3cluiPNK0rJwrRQBNueuMkt+teNfGKxsdY8WWdxNqcNo66eieXMwVsb5DnH415Hp2rajpE5n02/urOUjBe3laMkehIPIrVm8eeLrhNknibVivoLtx/I1UPinxC3XXtUP1vJP8ay5JZJpGkldnduSzHJP41//2Q=="
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# img, _：表示从数据集中解包每个元素。img 是输入数据（如图像），_ 是一个占位符，表示忽略标签（或其他不需要的数据）"
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.2860]), tensor([0.3205]))\n"
     ]
    }
   ],
   "source": [
    "#计算均值和方差\n",
    "def cal_mean_std(ds):\n",
    "    mean = 0.\n",
    "    std = 0.\n",
    "    for img, _ in ds: # 遍历每张图片,img.shape=[1,28,28]\n",
    "        mean += img.mean(dim=(1, 2))\n",
    "        std += img.std(dim=(1, 2))\n",
    "    mean /= len(ds)\n",
    "    std /= len(ds)\n",
    "    return mean, std\n",
    "\n",
    "\n",
    "print(cal_mean_std(train_ds))\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:33:10.398820900Z",
     "start_time": "2024-07-17T03:32:58.998047400Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "data": {
      "text/plain": "torch.Tensor"
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:33.598821200Z",
     "start_time": "2024-07-17T03:06:33.540172Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "data": {
      "text/plain": "9"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:33.599820400Z",
     "start_time": "2024-07-17T03:06:33.545914600Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "outputs": [
    {
     "data": {
      "text/plain": "torch.Tensor"
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(img) #tensor中文是 张量,和numpy的ndarray类似"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:33.600820300Z",
     "start_time": "2024-07-17T03:06:33.557907500Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [
    {
     "data": {
      "text/plain": "9"
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:33.601819800Z",
     "start_time": "2024-07-17T03:06:33.573680700Z"
    }
   }
  },
  {
   "cell_type": "code",
   "source": [
    "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
    "def show_img_content(img):\n",
    "    from PIL import Image\n",
    "\n",
    "    # 打开一个图像文件\n",
    "    # img = Image.open(img)\n",
    "\n",
    "\n",
    "    print(\"图像大小:\", img.size)\n",
    "    print(\"图像模式:\", img.mode)\n",
    "\n",
    "\n",
    "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
    "    if img.mode == 'L':\n",
    "        pixel_values = list(img.getdata())\n",
    "        print(pixel_values)\n",
    "show_img_content(img) #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-14T08:17:45.718267Z",
     "start_time": "2025-01-14T08:17:45.714160Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "图像大小: (28, 28)\n",
      "图像模式: L\n",
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130, 72, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88, 172, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12, 219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197, 209, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119, 167, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55, 236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209, 92, 0, 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237, 226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255, 77, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228, 207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244, 159, 0, 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217, 226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238, 215, 0, 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200, 159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232, 246, 0, 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240, 80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228, 225, 0, 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217, 241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224, 229, 29, 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198, 213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221, 230, 67, 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219, 221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205, 206, 115, 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211, 210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177, 210, 92, 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189, 188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216, 170, 0, 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244, 221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
     ]
    }
   ],
   "execution_count": 17
  },
  {
   "cell_type": "code",
   "source": [
    "#这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
    "def show_single_image(img_arr):\n",
    "    plt.imshow(img_arr, cmap=\"binary\") # 显示图片\n",
    "    plt.colorbar() # 显示颜色条\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "show_single_image(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-14T08:19:34.826746Z",
     "start_time": "2025-01-14T08:19:34.771801Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 20
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:34.493969600Z",
     "start_time": "2024-07-17T03:06:33.615812900Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 700x480 with 15 Axes>",
      "image/png": "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fvllJyUlxWq3Y8cO56abbnIKFy7sAPB1KPblhA5u3LjR6d27t1O5cmUnJCTEiYiIcDp16uSsX7/etLmcueMWOjhkyJB077969WonJibGCQ4OzlVhhDkJx8//pIZfp/4XHBzslCtXzrn55pudV1991aSISCW9d65k6tSpTkxMjFO4cGGnaNGiTv369Z3hw4c7v/76q+M4gc2Djz/+2LnllluciIgIJzg42KlcubIzePBg57fffsuah+BjuAYzRpDjBODtQwghhBCSC7ni6teEEEIIITkFNzKEEEII8S3cyBBCCCHEt3AjQwghhBDfwo0MIYQQQnwLNzKEEEII8S3cyBBCCCHEt2So1hLJn8iUQxmttbF9+3YjDx061MipBUdTue6664wsK6AXLGhP2W3bthl5zpw5Rq5WrZrVbvjw4UYuUaLEZfY6/6Irx7/33ntG7tu3r5HLlSt3xffatGmTkVPrkqVy++23Gzk10zZxJzEx0chffvmldW7u3LlGLlWqlJHvueceq931119vZDken3zyidVu2bJlRpa16vr06WO1GzRoUEB9JznHr7/+auTIyMgc7MnlQY0MIYQQQnwLM/sSi4xoXb777jvrWBbV1P96k+XkZan533//3Wp3/PjxgO4tqVmzppFldXLA/hel1B7oKsCPPfaYkevXr3/ZfcgLyHGZMWOGde6VV14xstSUhYeHW+3kOalBkdcG7OJ2P//8s5G7du1qtWvevLmR77jjDq/u5xsWLVpk5AkTJljnZIXk5ORk65yss3T69GkjS+0mABw6dMjIVapUMbLWipYvX97IxYsXN7IuXPjLL78YuV27dkZ+7bXXQGzatGlj5BMnTljnypQpY2RZKFmOkRdS6wIArVu3NrJ8D1euXNlqt2TJEiNLzVtugBoZQgghhPgWbmQIIYQQ4lu4kSGEEEKIb6GPDAkYaU+XESubN2+22skpVaRIEeuctN1LW7v0nQGACxcuGPnUqVNGvvrqq6128nOB+vT88ccfRta+OdKfoEWLFta5Dz/8MKDr5yVmz55tHcvxe/75542s7e7Sv0L6SuiIsaJFixpZ+k3cddddVjvpW6P9Z/ITe/bsMfKoUaOMHBERYbWT8zolJcU6J/3H5BqUPkoaubb0Wi1WrJiRpT+U9qUpXbq0kaW/jJ4T48aNc+1HfqFVq1ZGlmMO2OtJjrN+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EBwcjISEBPP3Dz/8EDExMShcuDBKlSqFO++8Ez///LP12VatWqFevXrYsGEDbrrpJlx99dV48sknL3lPv8I16E8CXZfTpk1DmzZtEBERgZCQENSpUweTJk1K85kqVaqgU6dOWLlyJZo0aYLQ0FBUq1YNH3zwQZq227ZtQ5s2bVC4cGFUrFgRzz33HFJSUtK0mzt3Ljp27IjIyEiEhIQgOjoazz77rDWe+RmOYeaRoxuZPXv2AABKly6d6dceNWoUhgwZgsjISIwbNw633347pkyZgltuuQV//vknAKBXr144e/Ys/ve//1mfPXfuHObPn48ePXqgQIECAIDp06ejY8eOKFKkCMaMGYOnnnoKP/zwA1q0aJHGOerChQuIi4tDREQExo4di9tvvz3Tv192ERUVhQ0bNuD777+/ZNuVK1fioYcewp133omXXnoJf/zxB26//XYcO3bMtDl06BCaNWuGZcuWYejQoXj11VdRvXp13HfffXjllVdMu9OnT+Ptt99Gq1atMGbMGIwaNQpHjhxBXFwcNm3a5NqHixcvon///vjggw8wZ84cdO/eHcBf//rp27cvatSogfHjx2PYsGH4/PPPcdNNN1k/rABw7NgxtG/fHg0bNsQrr7yC1q1bX9Yz8xNcg/4k0HU5adIkREVF4cknn8S4ceNQqVIlPPTQQ3jzzTfTtN29ezd69OiBm2++GePGjUPJkiXRv39/a6N48OBBtG7dGps2bcKIESMwbNgwfPDBB3j11VfTXO+9995DkSJF8Pe//x2vvvoqYmJi8PTTT2PEiBFX/gDyABzDTMTJBqZNm+YAcJYtW+YcOXLE+fnnn50ZM2Y4pUuXdgoXLuz88ssvTmxsrBMbG5vms/369XOioqKsvwFwRo4cmeb6iYmJjuM4zuHDh53g4GDnlltucS5evGjavfHGGw4A591333Ucx3FSUlKcChUqOLfffrt1/VmzZjkAnK+++spxHMdJSkpySpQo4QwcONBqd/DgQad48eLW3/v16+cAcEaMGHG5jylX8tlnnzkFChRwChQo4DRv3twZPny4s2TJEic5OdlqB8AJDg52du/ebf62efNmB4Dz+uuvm7/dd999Tvny5Z2jR49an7/zzjud4sWLO+fOnXMcx3EuXLjgnD9/3mpz4sQJp2zZss6AAQPM3xITEx0Azssvv+z8+eefTq9e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eDhatWqFM2fOuLY7f/48Ro4cierVqyMkJASVKlXC8OHDcf78+YC/z4YNG3DDDTeY+TB58uQ0bQ4fPoz77rsPZcuWRWhoKK699lq8//77adqdPXsWjz32GCpVqoSQkBBcc801GDt2LBzHMW2CgoJw9uxZvP/++2Yu9O/fP+D+5hR79uxB3bp107xYASAiIsLI06ZNQ5s2bRAREYGQkBDUqVMHkyZNSvOZKlWqoFOnTli5ciWaNGmC0NBQVKtWDR988EGattu2bUObNm1QuHBhVKxYEc899xxSUlLStJs7dy46duyIyMhIhISEIDo6Gs8++ywuXrx4ZV8+D8Dx8w+BjlXq782nn36KevXqISQkBHXr1sXixYvTfO7AgQMYMGAAypYta9q9++67Vpvk5GQ8/fTTiImJQfHixREWFoaWLVtixYoVl+yz4zgYNGgQgoODkZCQYP7+4YcfIiYmBoULF0apUqVw55134ueff7Y+m+qvuGHDBtx00024+uqr8eSTT17ynldCjmpkroTDhw/jlltuQXh4OEaMGIESJUpg37591kNP5aOPPkJSUhIGDx6MoKAgvPTSS+jevTv27t2LQoUKed5n+fLlmDVrFoYOHYoyZcrg2muvxaRJk/Dggw+iW7du6N69OwCgQYMGWfI9s5r4+Hh0794dwcHB6N27NyZNmoR169ahcePGadpm5DmuW7cOcXFxaNSoEebOnYvChQun2y4lJQVdunTBypUrMWjQINSuXRtbt27FhAkTsHPnzoB8UE6cOIEOHTqgZ8+e6N27N2bNmoUHH3wQwcHBZoP7+++/o1WrVti9ezeGDh2KqlWrYvbs2ejfvz9OnjyJRx99FMBfC7lLly5YsWIF7rvvPjRs2BBLlizB448/jgMHDmDChAkA/jKP3n///WjSpAkGDRoEAIiOjr5kX3OaqKgorFmzBt9//72nk/SkSZNQt25ddOnSBQULFsT8+fPx0EMPISUlBUOGDLHa7t69Gz169MB9992Hfv364d1330X//v0RExODunXrAgAOHjyI1q1b48KFCxgxYgTCwsIwderUdOfFe++9hyJFiuDvf/87ihQpguXLl+Ppp5/G6dOn8fLLL2fuA/EZHD//EOhYAcDKlSuRkJCAhx56CEWLFsVrr72G22+/HT/99BNKly4NADh06BCaNWtmNj7h4eFYtGgR7rvv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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
    "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
    "    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6，宽，高\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index = n_cols * row + col  # 计算索引，从0开始\n",
    "            plt.subplot(n_rows, n_cols, index+1)#因为从1开始\n",
    "            img_arr, label = train_ds[index]\n",
    "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维\n",
    "            plt.imshow(img_arr, cmap=\"binary\",\n",
    "                       interpolation = 'nearest')#interpolation='nearest'是临近插值\n",
    "            plt.axis('off')#去除坐标系\n",
    "            plt.title(class_names[label]) # 显示类别名称\n",
    "    plt.show()\n",
    "    \n",
    "    \n",
    "\n",
    "#已知的图片类别\n",
    "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot'] #0-9分别代表的类别\n",
    "#只是打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:34.502676900Z",
     "start_time": "2024-07-17T03:06:34.495968400Z"
    }
   },
   "outputs": [],
   "source": [
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True) #batch_size分批，shuffle洗牌\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
    "\n",
    "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
    "\n",
    "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
    "\n",
    "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。\n",
    "\n",
    "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
    "\n",
    "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
    "\n",
    "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:34.555159500Z",
     "start_time": "2024-07-17T03:06:34.506683500Z"
    }
   },
   "outputs": [],
   "source": [
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__() # 继承父类的初始化方法，子类有父类的属性\n",
    "        self.flatten = nn.Flatten()  # 展平层\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(784, 300),  # in_features=784, out_features=300, 784是输入特征数，300是输出特征数\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(300, 100),#隐藏层神经元数100\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(100, 10),#输出层神经元数10\n",
    "        )\n",
    "\n",
    "    def forward(self, x): # 前向计算\n",
    "        # x.shape [batch size, 1, 28, 28]\n",
    "        x = self.flatten(x)  \n",
    "        # 展平后 x.shape [batch size, 784]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits #没有经过softmax,称为logits\n",
    "    \n",
    "model = NeuralNetwork()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:34.557156400Z",
     "start_time": "2024-07-17T03:06:34.531072900Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "NeuralNetwork(\n  (flatten): Flatten(start_dim=1, end_dim=-1)\n  (linear_relu_stack): Sequential(\n    (0): Linear(in_features=784, out_features=300, bias=True)\n    (1): ReLU()\n    (2): Linear(in_features=300, out_features=100, bias=True)\n    (3): ReLU()\n    (4): Linear(in_features=100, out_features=10, bias=True)\n  )\n)"
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 看看网络结构\n",
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "outputs": [
    {
     "data": {
      "text/plain": "266610"
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "784*300+300+300*100+100+100*10+10"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:34.557156400Z",
     "start_time": "2024-07-17T03:06:34.537519200Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:34.563404800Z",
     "start_time": "2024-07-17T03:06:34.552159400Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "source": [
    "for name, param in model.named_parameters(): # 打印模型参数\n",
    "      print(name, param.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:34.676506700Z",
     "start_time": "2024-07-17T03:06:34.563404800Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "[Parameter containing:\n tensor([[ 0.0197, -0.0019,  0.0188,  ..., -0.0344,  0.0148,  0.0281],\n         [ 0.0339,  0.0111, -0.0346,  ..., -0.0150, -0.0077,  0.0120],\n         [ 0.0283, -0.0012, -0.0145,  ...,  0.0240, -0.0286,  0.0164],\n         ...,\n         [-0.0103,  0.0226,  0.0246,  ...,  0.0072, -0.0274,  0.0174],\n         [-0.0230, -0.0281,  0.0328,  ..., -0.0168,  0.0289, -0.0048],\n         [ 0.0238,  0.0003,  0.0235,  ..., -0.0152,  0.0004,  0.0221]],\n        requires_grad=True),\n Parameter containing:\n tensor([-2.1050e-02, -1.9314e-02, -2.6576e-02,  1.3246e-02, -2.5810e-02,\n          8.0059e-03, -4.0981e-03, -2.6547e-02, -4.0199e-03,  2.0223e-02,\n         -6.8452e-03,  2.5522e-02, -1.1530e-02, -1.3210e-03, -2.3066e-02,\n          1.2100e-02,  1.6422e-02,  3.2263e-02, -2.6653e-02,  5.9833e-03,\n          1.7885e-02, -2.8033e-02,  1.7354e-03, -3.1785e-02, -2.8058e-02,\n          3.5126e-02,  1.8703e-02,  1.7342e-02,  3.3137e-02,  7.9030e-03,\n         -9.7580e-03, -1.3025e-02, -1.2485e-02, -1.4885e-02,  2.2343e-02,\n          2.3991e-02,  2.3657e-02,  1.1792e-04, -2.2924e-02,  2.9145e-02,\n         -3.0524e-02, -8.5632e-03,  9.5998e-03, -6.0649e-03,  2.1613e-02,\n         -9.9673e-03,  5.2075e-03,  3.2322e-02, -1.7615e-02, -3.4756e-03,\n         -3.0307e-02, -2.9611e-02, -2.1370e-02, -1.8454e-02, -1.9918e-02,\n          2.1922e-02, -4.9497e-03,  1.5263e-02, -1.5556e-03, -2.8485e-02,\n         -2.4385e-02,  2.1901e-02,  1.0883e-02,  3.4475e-02, -1.6224e-04,\n         -2.2289e-02,  1.9277e-02, -2.8782e-02, -2.2460e-02,  1.7166e-02,\n          2.0502e-02, -2.4870e-03, -1.1201e-02, -2.5182e-02, -1.9456e-02,\n         -3.5515e-02,  6.7390e-03, -3.4117e-02,  1.1170e-02, -2.2099e-02,\n         -1.7369e-02, -2.8536e-02,  2.7551e-02, -1.4172e-02,  3.8292e-03,\n         -1.1135e-02,  3.2708e-02,  2.5166e-02,  2.7477e-02,  7.5499e-03,\n         -2.7612e-02,  2.0464e-02,  1.9369e-02,  1.6136e-02, -2.7646e-02,\n         -3.0211e-02,  1.0383e-02, -2.0172e-03,  2.0835e-02,  3.4924e-02,\n          1.7167e-02, -8.0474e-03,  2.2624e-05, -1.4278e-02,  2.5172e-02,\n          2.8794e-02,  7.7580e-03,  3.3192e-02, -3.2882e-02,  3.5662e-02,\n          5.5504e-03,  5.8740e-03, -1.4467e-02, -2.7093e-02,  3.9164e-03,\n         -2.7451e-02,  2.5987e-03,  2.2366e-02,  1.5111e-02,  2.1005e-02,\n         -2.8695e-02,  2.3164e-02,  2.0061e-02,  2.8095e-02,  2.5704e-02,\n          3.7709e-03,  9.4083e-03, -1.5392e-02,  1.6506e-02, -1.5301e-02,\n          2.2287e-02,  2.9055e-02,  5.5264e-03,  2.3765e-02, -3.3732e-02,\n         -1.7466e-02,  2.6919e-02,  2.5695e-02,  6.0866e-03,  1.1001e-02,\n         -7.0402e-03,  1.2708e-02, -2.8719e-02,  2.8549e-02,  2.6545e-02,\n         -1.1645e-02,  1.1322e-02, -2.7334e-02, -1.2489e-02,  8.7290e-03,\n          3.2820e-02, -2.0122e-02, -2.9005e-02, -2.8816e-02, -7.9098e-03,\n          1.8073e-02,  2.5796e-02, -2.1713e-02,  2.5658e-02, -3.0044e-02,\n         -1.8457e-02, -7.6333e-03,  2.6855e-02,  3.0319e-02,  1.4851e-02,\n          1.1692e-02,  1.2689e-02, -1.3469e-02, -6.6083e-03,  3.1946e-02,\n         -1.0642e-03, -9.9706e-03, -5.1618e-03, -1.3057e-02,  2.9175e-02,\n         -1.0350e-02,  1.0834e-02, -1.8911e-02,  3.2929e-02, -9.7022e-03,\n          1.6919e-02, -2.5154e-02, -1.8531e-02,  2.4107e-02, -2.8309e-02,\n         -6.8789e-03,  3.3900e-02, -9.3259e-03,  2.0367e-02, -2.7695e-02,\n         -5.7768e-03, -2.1928e-02, -7.3732e-03, -2.6847e-02, -1.5531e-02,\n         -6.2058e-03,  3.5619e-02, -1.3138e-02,  5.7206e-04,  4.3437e-03,\n         -1.3741e-02, -2.1778e-02, -4.0394e-03,  1.8083e-02,  2.9634e-02,\n          3.0742e-02, -2.5131e-02,  1.6999e-02, -2.1274e-02,  1.5197e-02,\n         -1.5845e-02, -2.0283e-02,  2.7143e-03,  1.3767e-02,  5.0491e-03,\n          1.8341e-02, -3.1915e-02,  2.4155e-02, -1.1578e-02, -1.0281e-02,\n          2.4682e-03, -2.9838e-02, -1.3722e-02, -1.0683e-02,  5.2317e-03,\n         -3.1961e-02,  2.9169e-02, -6.7957e-03, -1.4377e-03,  1.5577e-02,\n          3.5137e-02,  1.6349e-02, -1.0426e-02, -2.5683e-03, -7.2982e-03,\n         -1.2943e-02,  1.9343e-02,  1.3223e-02,  2.3281e-02, -1.3918e-02,\n          1.5815e-02, -1.3981e-02, -2.4227e-02,  1.8644e-02, -3.4953e-02,\n         -4.4070e-03,  1.9709e-02, -1.4838e-02,  3.5673e-02, -1.4618e-03,\n          2.5542e-02, -2.8218e-02,  7.3523e-03, -6.1958e-03, -2.2752e-02,\n          7.7110e-03, -1.1244e-02, -2.3862e-02,  9.5969e-03,  7.7248e-03,\n         -1.3264e-02,  3.2863e-02,  1.8938e-02, -2.7677e-02, -1.2692e-02,\n         -5.9880e-03, -1.4882e-02, -8.0966e-03, -1.3946e-02, -6.3663e-04,\n          4.7108e-03, -2.4499e-02, -2.4798e-02, -3.0166e-03,  1.7670e-02,\n          3.1127e-02,  9.5361e-03,  2.4212e-02, -4.3462e-03, -3.4271e-02,\n          9.0047e-03, -5.7195e-03,  1.2753e-03,  3.1337e-02,  2.4517e-02,\n          3.1984e-02, -7.7789e-03,  2.4187e-02, -3.2379e-02, -2.2551e-02,\n         -3.3395e-02,  1.5578e-02,  3.1022e-02,  1.5726e-02,  1.3086e-02,\n          9.6259e-03,  2.7839e-02,  3.0091e-02, -1.1492e-02, -1.8206e-02],\n        requires_grad=True),\n Parameter containing:\n tensor([[ 0.0123,  0.0483, -0.0425,  ..., -0.0413, -0.0363, -0.0076],\n         [ 0.0309,  0.0310, -0.0536,  ...,  0.0107,  0.0064, -0.0459],\n         [ 0.0273, -0.0055, -0.0498,  ...,  0.0492, -0.0010,  0.0091],\n         ...,\n         [-0.0322,  0.0263,  0.0366,  ..., -0.0029, -0.0335,  0.0372],\n         [-0.0315, -0.0063,  0.0423,  ..., -0.0079,  0.0346,  0.0184],\n         [-0.0375, -0.0014,  0.0513,  ...,  0.0280,  0.0177, -0.0183]],\n        requires_grad=True),\n Parameter containing:\n tensor([-0.0228,  0.0139, -0.0460, -0.0280,  0.0028,  0.0102, -0.0549, -0.0252,\n         -0.0295,  0.0338,  0.0355,  0.0031,  0.0558,  0.0507,  0.0204,  0.0214,\n          0.0431, -0.0493, -0.0472, -0.0548,  0.0477,  0.0118,  0.0462, -0.0099,\n         -0.0072, -0.0181, -0.0292,  0.0548,  0.0316,  0.0024, -0.0263,  0.0290,\n          0.0120,  0.0370, -0.0280,  0.0464, -0.0512,  0.0496,  0.0037,  0.0199,\n          0.0564,  0.0248, -0.0272,  0.0431,  0.0248,  0.0474,  0.0388,  0.0370,\n          0.0278, -0.0481, -0.0019,  0.0508,  0.0442,  0.0174,  0.0328,  0.0016,\n         -0.0048,  0.0005,  0.0405, -0.0038,  0.0318, -0.0551,  0.0551, -0.0420,\n          0.0121, -0.0535,  0.0337,  0.0078, -0.0537,  0.0384, -0.0036, -0.0300,\n          0.0066,  0.0055, -0.0394,  0.0484,  0.0287, -0.0076,  0.0486,  0.0333,\n         -0.0233, -0.0398,  0.0404, -0.0088,  0.0027, -0.0530, -0.0423,  0.0103,\n         -0.0526, -0.0449, -0.0510, -0.0002,  0.0132, -0.0537,  0.0210, -0.0352,\n          0.0298, -0.0316, -0.0270,  0.0347], requires_grad=True),\n Parameter containing:\n tensor([[-6.0130e-02, -8.3495e-02,  9.6607e-02, -5.7429e-02, -9.6071e-02,\n          -8.3338e-02, -3.3011e-02, -6.9930e-02, -6.3223e-02, -3.1966e-03,\n           5.8682e-02,  7.2221e-02, -2.1062e-02, -5.6546e-02,  5.1099e-02,\n           9.7967e-02, -3.7028e-02,  5.3559e-02, -8.6131e-02, -6.9208e-02,\n           8.0710e-02, -7.3043e-02,  4.5039e-02, -9.3380e-02, -7.8587e-02,\n           9.3720e-02,  7.7505e-02, -5.6351e-02,  6.7467e-03, -9.3763e-02,\n          -5.2262e-02,  5.9072e-02,  5.1391e-02,  4.2821e-03,  3.2556e-02,\n           6.3899e-02, -4.4313e-02, -8.9473e-02, -9.8254e-02, -5.5724e-02,\n           1.0261e-03,  1.0582e-02,  7.9726e-02,  4.5462e-02, -3.1519e-02,\n          -7.5007e-02, -6.8078e-02,  9.5482e-02,  2.9369e-02, -2.9901e-02,\n          -6.3054e-02, -4.1868e-02, -7.3120e-02,  3.0573e-02,  1.2656e-02,\n          -2.4444e-02,  7.0800e-02, -7.5909e-02,  4.3673e-02, -5.8786e-02,\n          -8.5634e-02,  5.6461e-02,  7.0702e-02, -9.9231e-02, -4.3549e-02,\n          -7.9827e-02, -1.4030e-02,  8.8482e-02,  4.5954e-02,  7.8292e-02,\n          -5.6477e-02, -7.2849e-03,  7.7692e-02, -8.4456e-02,  8.8740e-02,\n           5.4060e-02,  6.6025e-02,  3.2243e-02,  7.5337e-03, -3.2036e-02,\n          -7.6570e-02,  7.3407e-02,  3.6837e-02, -2.2644e-02, -3.9086e-02,\n           2.3395e-02,  7.4497e-03,  3.3712e-02,  2.1986e-02, -5.3247e-02,\n          -3.3054e-02, -7.2131e-02,  2.8450e-02,  3.8844e-02,  6.2580e-02,\n          -9.1337e-02, -3.1493e-02, -1.7929e-02, -3.7643e-02,  2.5197e-02],\n         [-1.3236e-04,  9.4036e-02,  5.6964e-02, -6.6412e-02,  3.4064e-03,\n          -7.6178e-02,  7.9663e-02,  2.4730e-03,  6.4032e-02, -5.4588e-02,\n          -3.7366e-02, -9.5438e-02, -7.9044e-02, -1.5881e-02, -6.6345e-02,\n          -2.0953e-02,  9.4760e-02,  1.9920e-02,  7.7501e-03,  9.6019e-02,\n           5.7768e-02,  5.0741e-02,  7.0149e-02,  5.7490e-02,  5.3715e-02,\n          -1.3677e-02,  7.6855e-02,  1.7013e-02,  8.4212e-03, -1.3155e-02,\n          -4.2644e-02,  6.5930e-02, -6.9459e-03, -5.6164e-02,  1.5528e-02,\n          -1.8926e-02, -3.7959e-02,  6.5165e-03,  2.2758e-02, -3.0728e-02,\n           7.0005e-02,  2.5183e-02, -9.5417e-02,  5.6544e-02,  5.0016e-02,\n          -6.2522e-02,  3.0933e-02,  1.8161e-02,  3.2408e-02, -8.7170e-02,\n           6.9874e-02, -3.7772e-02,  8.8603e-02,  7.6133e-03, -4.0512e-02,\n           2.4179e-02, -1.6096e-03,  1.1196e-03, -6.0443e-02,  8.1556e-02,\n          -1.3739e-02,  8.7892e-02,  8.2008e-03, -9.2654e-02,  9.6815e-03,\n          -3.9118e-02, -7.5247e-02, -6.3157e-02, -1.2610e-02,  8.4260e-03,\n          -1.8649e-02, -7.3806e-02, -6.2894e-02,  5.2154e-02,  7.2742e-02,\n           4.2855e-02, -6.6772e-02, -4.3242e-02, -5.6507e-03,  9.3130e-02,\n          -2.9259e-02, -7.0200e-02, -9.8912e-02,  6.7631e-02,  9.2828e-02,\n          -7.6511e-02, -7.6219e-02,  1.2133e-02, -6.9237e-04, -1.2154e-03,\n          -4.3823e-02,  4.9812e-02,  7.7890e-02,  9.2359e-02,  7.9810e-02,\n          -3.1719e-02, -6.2083e-02,  4.3272e-02, -6.4213e-02, -5.6480e-02],\n         [ 4.0483e-02, -6.8416e-03, -5.2425e-02,  9.3152e-02,  6.4434e-02,\n          -9.8190e-02,  4.7990e-03,  6.0009e-02,  8.6882e-02,  5.1153e-02,\n          -2.8519e-02,  7.1608e-02, -8.9633e-03,  4.8728e-02, -7.1871e-02,\n           2.0788e-02,  4.5276e-02,  8.1203e-02, -7.1214e-02, -2.9254e-02,\n           2.2983e-02,  1.8083e-02,  5.0721e-02, -9.9948e-02, -1.7609e-02,\n          -6.8137e-02, -4.7844e-02, -5.9178e-02,  2.0026e-02, -8.9974e-02,\n           1.1555e-02, -8.6759e-02,  1.5619e-02, -1.1790e-02, -1.4634e-02,\n          -7.0560e-02,  2.6573e-02,  3.9585e-02, -5.3253e-03, -4.6472e-02,\n          -1.1857e-02,  8.5200e-02, -4.1485e-02,  2.4965e-02,  9.2092e-02,\n          -1.2298e-03, -5.2900e-02, -1.1399e-02,  1.2087e-02,  7.9048e-02,\n          -5.5766e-02, -7.6177e-02, -3.1099e-03, -4.7613e-02, -8.0160e-02,\n          -8.0346e-02, -2.1055e-03,  8.8014e-02, -7.4857e-03,  6.8898e-02,\n           3.8736e-02,  8.7398e-02, -2.4868e-02,  6.9595e-03, -5.1288e-02,\n           2.0060e-02,  5.0386e-02, -5.0755e-02,  8.2797e-02, -9.5554e-03,\n          -7.5282e-02,  5.1161e-02, -8.9509e-02,  1.8322e-02,  6.9332e-02,\n          -6.7907e-03, -5.3345e-02, -2.3632e-02,  7.5079e-02,  7.4746e-03,\n          -9.5109e-02,  7.9615e-02, -9.4885e-02,  6.3109e-02, -7.0714e-02,\n           8.0563e-02,  3.4645e-02,  3.9211e-03,  6.9876e-02, -8.1899e-02,\n           5.4073e-02,  1.4628e-02,  4.4878e-02, -5.3106e-02,  2.1994e-02,\n           6.1222e-03,  5.5426e-02, -8.0531e-02, -6.7794e-02, -7.7613e-02],\n         [ 2.4500e-02,  7.2333e-02, -3.1123e-02, -8.7001e-02, -2.7453e-02,\n           6.7959e-02, -8.3819e-03,  7.7426e-02, -1.7909e-02, -8.8891e-02,\n           5.8366e-02,  4.8936e-02,  9.2684e-02,  5.2533e-02, -7.9488e-02,\n           1.8379e-02, -3.0360e-02, -3.0753e-02, -3.4733e-02, -9.0119e-02,\n           4.7143e-02, -5.0747e-02,  2.1179e-04,  3.8950e-02, -8.9712e-02,\n           6.6451e-02, -9.6144e-02, -6.1788e-02,  7.0850e-02,  3.9342e-02,\n          -1.2581e-02,  3.6897e-02, -4.4431e-02,  6.8393e-02,  4.8829e-02,\n           4.9818e-02, -2.3020e-02,  5.8259e-02,  9.6217e-02, -3.5013e-02,\n          -4.6166e-02, -5.4435e-02,  3.2281e-02,  6.2610e-02,  1.2985e-02,\n           1.8624e-02,  4.6095e-02, -7.0899e-02,  5.4375e-02, -2.6193e-02,\n           2.8783e-02, -6.1728e-02, -2.5476e-02,  4.4656e-02,  3.3932e-02,\n           3.6489e-02,  2.5059e-02, -1.9401e-02, -4.9903e-02,  8.9120e-02,\n           2.4902e-02,  8.1709e-03,  2.9631e-02,  4.7083e-02, -4.4443e-02,\n           9.9905e-02,  6.3115e-02,  6.9755e-02,  9.5924e-02,  4.9799e-02,\n           2.9365e-02,  9.7140e-02, -5.2250e-02,  3.1216e-02,  4.8113e-02,\n           7.7540e-02,  4.0199e-02, -9.0440e-02,  3.2212e-03,  6.6246e-02,\n           6.7680e-02,  7.3278e-02, -4.0867e-02,  8.5295e-02,  8.5161e-02,\n          -1.3434e-02,  8.2480e-02, -7.2191e-02,  8.8933e-02, -3.4732e-02,\n           7.7661e-03,  7.5514e-02, -2.1365e-03,  7.5696e-02,  5.3812e-03,\n           7.5000e-02,  7.5694e-02,  7.3452e-02,  9.5269e-02,  1.6848e-02],\n         [ 6.1502e-02,  5.3355e-02, -4.7905e-03, -5.2838e-02, -9.5927e-02,\n           6.7455e-02, -8.4958e-02,  6.6829e-02, -2.9967e-03,  2.1280e-02,\n          -3.2498e-02, -6.5983e-02, -2.0610e-02, -4.0055e-02,  6.5298e-02,\n          -2.1123e-02, -9.9509e-02, -7.9316e-02, -6.5123e-02,  7.1169e-02,\n           9.1964e-02, -4.9223e-02,  3.6991e-02, -7.3808e-03,  7.1614e-02,\n          -5.6272e-02, -3.8589e-02, -8.5887e-02,  3.1559e-02, -8.6663e-02,\n          -9.6395e-02,  7.2603e-02, -1.1392e-02, -5.2626e-02,  1.0194e-02,\n           6.4996e-02, -7.4184e-02,  2.9827e-02, -1.2699e-02,  4.3498e-02,\n          -5.7315e-02, -6.9941e-03,  2.5196e-03,  1.7897e-03,  3.8093e-02,\n           6.9372e-02,  2.4994e-02,  7.4098e-02,  7.4752e-02, -9.6323e-02,\n          -7.6453e-02, -4.3497e-02, -2.9401e-02, -1.0443e-02, -7.4434e-02,\n          -7.7771e-02,  3.3348e-02,  6.7751e-02, -7.9955e-02, -2.4751e-02,\n          -4.6703e-02, -9.0535e-02, -9.3259e-02, -3.5107e-02, -6.4710e-02,\n          -5.1747e-02,  3.1003e-02,  4.3647e-02, -5.4505e-02,  4.2885e-02,\n           5.6999e-02, -9.5596e-02,  1.5339e-02,  8.4570e-02,  5.4454e-02,\n           4.7324e-02, -8.3082e-03, -2.2075e-03, -7.8938e-02,  3.8479e-02,\n           6.0532e-02,  6.4987e-02,  3.3774e-02, -2.1088e-02, -3.4947e-02,\n           9.7092e-02, -2.7822e-02,  1.0286e-02,  2.9398e-02,  7.3497e-02,\n          -7.2091e-02, -6.0638e-02,  4.9215e-02,  6.8468e-02, -1.6549e-02,\n           3.6786e-02,  1.0914e-02,  8.5312e-03, -4.5943e-02,  3.2379e-02],\n         [ 4.1773e-02,  1.5597e-02, -8.3080e-02, -8.7704e-02, -9.5537e-02,\n          -8.3099e-02, -8.9799e-02,  1.3072e-02, -3.5797e-02,  1.7768e-02,\n           1.7838e-03,  1.0944e-02, -7.6687e-02,  3.7210e-02, -5.7545e-02,\n          -4.6480e-02,  8.5321e-02,  3.2783e-02,  6.9899e-02,  6.4874e-02,\n           5.8726e-02, -2.5157e-02, -8.2586e-02, -6.9001e-02, -1.5943e-02,\n          -6.5620e-02,  9.6708e-02, -8.7270e-02,  2.9402e-02, -5.6570e-02,\n          -2.3157e-02,  7.4283e-02,  9.6706e-02,  3.3162e-02,  4.1436e-02,\n           5.6776e-02, -7.8789e-02,  2.6912e-02, -9.2613e-02, -8.3989e-02,\n          -6.4931e-02, -6.0251e-02,  1.8715e-02, -9.6741e-02,  4.7408e-02,\n           3.1221e-02, -7.0431e-02, -5.9665e-03, -5.4955e-02,  3.3854e-02,\n           3.5086e-02, -8.9525e-02,  9.7129e-02,  2.4386e-02,  6.7243e-02,\n          -1.4420e-02,  9.3975e-02,  7.6519e-02, -1.0521e-02, -4.5299e-02,\n           2.8422e-02,  7.0808e-02,  7.6344e-02, -2.4676e-02, -8.2343e-02,\n           4.8513e-03,  3.8305e-02,  9.0185e-02,  9.9975e-02, -9.8007e-02,\n          -4.6836e-02, -5.7161e-02, -1.9042e-02,  5.3226e-02, -8.1587e-03,\n           1.7198e-03,  8.3452e-02, -3.3746e-02,  6.3629e-02,  6.9027e-02,\n          -9.7742e-02,  9.7319e-02, -7.5568e-02, -7.1789e-02, -7.1928e-02,\n          -8.3824e-02,  9.9516e-02, -4.7114e-03, -8.8986e-02, -7.7001e-02,\n          -7.9901e-02, -9.8906e-02,  4.4254e-02,  8.6815e-02,  4.5723e-02,\n          -6.3458e-02,  6.5326e-02, -7.1798e-04, -8.3412e-02, -8.9374e-03],\n         [-1.1792e-02, -2.4718e-02, -2.6703e-02, -2.9230e-02, -9.6841e-02,\n          -9.1168e-02,  7.0478e-02, -2.1019e-02, -7.1793e-02,  3.3938e-02,\n           5.2035e-02, -6.7805e-02,  1.0297e-02,  2.7471e-02,  8.7953e-03,\n           2.4990e-02,  4.3063e-02, -3.4315e-02,  3.9873e-02, -7.9880e-02,\n          -5.7821e-02,  8.4742e-02, -2.1708e-02,  4.8998e-02,  1.1451e-03,\n           1.8876e-02,  6.5861e-02,  5.8204e-02, -6.4397e-02, -3.1337e-02,\n          -8.6048e-02, -3.7334e-04, -2.3949e-02, -9.9014e-03,  4.3647e-02,\n          -1.9256e-02, -4.6234e-02,  1.5653e-02, -3.8841e-02, -5.7615e-02,\n          -9.1229e-02, -2.5033e-02, -3.8859e-02,  7.3722e-02,  7.4554e-03,\n           5.2559e-02,  7.2811e-02, -8.8392e-03,  7.0505e-02, -6.9892e-02,\n           2.4908e-02,  9.9568e-03, -2.2079e-02, -4.4446e-02, -7.6628e-02,\n          -4.6345e-02,  2.8048e-02, -5.8549e-02, -5.2784e-02, -9.5117e-02,\n           4.6063e-02,  4.0065e-02,  1.5487e-02, -6.7593e-02,  5.8174e-02,\n           7.4716e-03,  9.6367e-02, -1.5685e-02,  3.5757e-02,  2.9894e-02,\n          -7.5247e-02,  9.4140e-02,  8.9437e-02,  3.7649e-02,  8.3018e-02,\n          -5.7398e-02, -1.4741e-02,  8.7193e-02,  9.9387e-02, -7.4430e-02,\n          -9.9500e-02, -5.9486e-03, -5.8153e-02, -8.4599e-03, -8.7248e-02,\n          -1.0705e-02, -9.7384e-02,  7.5056e-02,  3.2841e-03,  1.7219e-02,\n           4.8087e-02,  8.6383e-02,  2.6693e-02, -4.4950e-02, -5.4816e-03,\n           5.3111e-02,  3.4996e-02,  3.1422e-03, -5.0440e-02,  7.6522e-02],\n         [ 7.1793e-02, -6.0904e-02,  2.3984e-02,  8.8754e-02, -4.3350e-02,\n           2.8011e-02, -3.1942e-02,  5.1153e-02, -5.7419e-02, -9.3506e-02,\n          -7.7082e-03,  6.0579e-02, -7.0845e-02,  5.1071e-02, -7.4927e-02,\n          -8.3890e-02, -8.2645e-02,  1.2694e-02,  1.9767e-02,  2.3414e-02,\n           8.7182e-04,  3.0216e-02,  5.9771e-02,  6.9352e-02,  1.5419e-02,\n           7.5056e-02, -7.0732e-02, -2.5136e-02, -4.5398e-02, -6.2426e-02,\n          -5.6146e-02, -9.7006e-02,  5.9835e-02, -8.9028e-02,  8.3071e-02,\n          -4.5400e-02,  1.4934e-02, -7.3336e-05,  2.7643e-02,  7.0380e-02,\n          -6.7910e-03,  2.8293e-03, -8.8105e-03,  6.1241e-02, -4.4993e-02,\n          -2.6538e-02,  8.1207e-02, -6.4572e-02, -5.6349e-02,  1.1088e-02,\n          -7.9169e-02, -3.3891e-03,  3.4153e-02,  5.7154e-02, -9.9531e-03,\n           6.6727e-02, -7.6919e-02, -6.4555e-03, -9.5412e-02, -1.3207e-02,\n          -7.4825e-02,  8.7543e-02, -5.5766e-02,  5.3109e-02, -9.3936e-02,\n          -2.3520e-02,  9.3521e-02,  7.3517e-02,  6.5344e-02,  2.0140e-02,\n           8.2339e-02,  3.9801e-02, -6.5118e-02,  2.1250e-02, -8.9497e-02,\n           6.1368e-02, -4.6784e-02,  7.9716e-02,  8.4359e-02,  4.1103e-02,\n           2.4400e-02, -5.4142e-02,  7.0597e-02, -5.5107e-02, -8.8124e-02,\n           2.7846e-02, -3.4760e-02, -7.8880e-02,  6.0654e-02, -7.2346e-02,\n          -3.4012e-02,  2.3183e-02,  6.2211e-02, -7.4443e-02,  6.6295e-02,\n           1.1815e-02, -8.3835e-02,  9.5845e-02,  6.6863e-02, -5.8462e-02],\n         [-5.2836e-02, -3.4448e-02, -9.4741e-03, -9.7441e-03, -4.7255e-02,\n          -7.2035e-03,  6.0127e-02,  4.7272e-02, -6.4846e-02, -7.6542e-02,\n           3.4532e-02, -2.7678e-02,  2.7798e-02,  6.7987e-02, -8.3811e-02,\n           5.9718e-02, -4.5933e-02,  4.7198e-02,  8.4391e-02, -8.4525e-03,\n           2.1610e-02,  9.9988e-02, -3.2389e-02,  2.2483e-02,  1.9926e-02,\n          -4.5760e-02,  2.5794e-02, -3.6250e-02, -8.3315e-02,  7.4150e-02,\n          -6.8732e-02, -4.7845e-02, -7.0721e-02, -9.2449e-02,  7.8981e-02,\n          -8.1422e-02, -7.1579e-02, -5.5846e-02, -7.4096e-02, -4.9513e-02,\n           9.5629e-02,  6.2916e-02,  3.1054e-02, -3.9284e-02,  2.3542e-03,\n           8.7997e-02,  1.3928e-02, -9.3415e-02,  1.4924e-02, -5.5195e-03,\n           2.2549e-02, -9.2701e-03,  3.2844e-02,  4.6076e-04, -3.9216e-02,\n           1.8694e-02,  2.7758e-02, -4.8808e-02,  8.4745e-03,  6.8715e-02,\n           7.1682e-02, -4.0621e-02, -8.8940e-02,  6.6823e-02,  1.8080e-03,\n          -7.3351e-03,  3.3169e-02, -1.8774e-03, -9.5529e-02,  1.6290e-02,\n           6.6862e-05,  7.6996e-02, -7.7901e-02,  8.9373e-02, -5.4796e-02,\n           4.0845e-02,  6.9346e-02,  2.6311e-02,  5.6524e-02,  7.7192e-03,\n           4.0614e-02, -2.8587e-02, -4.2787e-02,  9.9284e-02, -6.0119e-02,\n           6.7653e-02, -7.5410e-02, -8.6914e-02,  6.0864e-02, -3.9379e-03,\n           3.7693e-02, -8.8116e-02,  2.5395e-02, -2.1937e-02, -6.6113e-02,\n          -7.4082e-02, -1.3656e-02,  7.8158e-02, -2.6194e-02, -2.5878e-03],\n         [ 3.6682e-03, -9.5649e-02, -7.7369e-02, -4.3635e-03,  8.2738e-02,\n           2.1932e-02,  7.4693e-02,  9.3547e-02,  7.5407e-02, -2.0256e-02,\n          -2.3761e-02,  2.2601e-02,  9.2214e-02,  3.1568e-02,  3.6623e-02,\n          -2.4496e-02, -4.7960e-02, -8.3394e-02, -2.7056e-02, -6.0002e-02,\n          -8.8228e-03,  2.3158e-02, -3.5178e-02, -9.6841e-02, -6.9582e-02,\n          -8.5318e-02,  6.6652e-03,  9.7461e-02, -8.1189e-02, -8.3079e-02,\n           3.0666e-02,  4.9231e-02,  9.5852e-02,  2.6855e-02,  4.5381e-02,\n           7.9014e-02,  6.0334e-02, -2.2344e-02,  1.2585e-02, -9.6757e-02,\n          -2.7457e-03, -5.7651e-02, -5.9702e-02,  4.6691e-02, -7.2139e-02,\n          -7.6851e-02, -6.4360e-02,  8.3329e-02,  7.3978e-02,  8.7770e-02,\n          -9.4119e-02, -1.6744e-02, -1.2021e-03,  3.7532e-02,  2.6994e-02,\n          -9.9777e-02, -2.7699e-02,  1.9135e-02,  2.8201e-03, -4.9553e-02,\n          -4.1715e-02,  5.5384e-02,  1.3868e-03, -1.6193e-02, -9.3173e-02,\n           9.2439e-02, -8.3537e-02, -1.8666e-02,  8.9735e-02, -6.9066e-02,\n           5.4657e-03,  2.7258e-02,  4.4724e-02,  3.1664e-02, -6.6928e-04,\n          -4.0023e-02,  7.9911e-02, -6.9789e-02, -2.5266e-02, -6.0303e-02,\n          -1.1250e-02,  2.9992e-02,  8.0512e-02,  9.7115e-02, -7.6228e-02,\n          -9.4497e-02, -4.5781e-02, -4.8058e-02, -3.3176e-02, -8.4835e-02,\n          -1.2173e-02, -6.9307e-02, -9.9202e-02, -5.4777e-02, -4.3978e-02,\n           5.1879e-03,  4.2043e-02,  1.9867e-02, -2.4383e-02,  8.8266e-02]],\n        requires_grad=True),\n Parameter containing:\n tensor([ 0.0274,  0.0221, -0.0726,  0.0271, -0.0003,  0.0845,  0.0734,  0.0123,\n         -0.0865,  0.0055], requires_grad=True)]"
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 看看模型参数\n",
    "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:34.677508500Z",
     "start_time": "2024-07-17T03:06:34.619793100Z"
    }
   },
   "outputs": [],
   "source": [
    "# model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:34.678507600Z",
     "start_time": "2024-07-17T03:06:34.625324900Z"
    }
   },
   "outputs": [],
   "source": [
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss() #内部先做softmax，然后计算交叉熵\n",
    "# 2. 定义优化器 采用SGD\n",
    "# Optimizers specified in the torch.optim package,随机梯度下降\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:35.192587400Z",
     "start_time": "2024-07-17T03:06:34.637807300Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad() # 装饰器，禁止反向传播，节省内存\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = [] # 记录损失\n",
    "    pred_list = [] # 记录预测\n",
    "    label_list = [] # 记录标签\n",
    "    for datas, labels in dataloader:#10000/32=312\n",
    "        datas = datas.to(device) # 转到GPU\n",
    "        labels = labels.to(device) # 转到GPU\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item()) # 记录损失\n",
    "        \n",
    "        preds = logits.argmax(axis=-1)    # 验证集预测,argmax返回最大值索引\n",
    "        # print(preds)\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())#将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
    "        # print(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list) # 计算准确率\n",
    "    return np.mean(loss_list), acc\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "outputs": [
    {
     "data": {
      "text/plain": "37500"
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1875*20"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:35.201490200Z",
     "start_time": "2024-07-17T03:06:35.194584600Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:17:13.841145200Z",
     "start_time": "2024-07-17T03:06:35.205487200Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "  0%|          | 0/37500 [00:00<?, ?it/s]",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "8caa82c7623647999980834cf354e12a"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar: # 进度条 1875*20,60000/32=1875\n",
    "        for epoch_id in range(epoch): # 训练epoch次\n",
    "            # training\n",
    "            for datas, labels in train_loader: #执行次数是60000/32=1875\n",
    "                datas = datas.to(device) #datas尺寸是[batch_size,1,28,28]\n",
    "                labels = labels.to(device) #labels尺寸是[batch_size]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
    "                optimizer.step() #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
    "\n",
    "                preds = logits.argmax(axis=-1) # 训练集预测\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())   # 计算准确率，numpy可以\n",
    "                loss = loss.cpu().item() # 损失转到CPU，item()取值,一个数值\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                }) # 记录训练集信息，每一步的损失，准确率，步数\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval() # 进入评估模式\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train() # 进入训练模式\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1 # 全局步数加1\n",
    "                pbar.update(1) # 更新进度条\n",
    "                pbar.set_postfix({\"epoch\": epoch_id}) # 设置进度条显示信息\n",
    "        \n",
    "    return record_dict\n",
    "        \n",
    "\n",
    "epoch = 20 #改为40\n",
    "model = model.to(device)\n",
    "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "outputs": [
    {
     "data": {
      "text/plain": "[{'loss': 0.1997792273759842, 'acc': 0.9375, 'step': 37495},\n {'loss': 0.27049633860588074, 'acc': 0.875, 'step': 37496},\n {'loss': 0.1393028050661087, 'acc': 0.9375, 'step': 37497},\n {'loss': 0.2725451588630676, 'acc': 0.84375, 'step': 37498},\n {'loss': 0.4061542749404907, 'acc': 0.8125, 'step': 37499}]"
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "record[\"train\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:19:11.487400800Z",
     "start_time": "2024-07-17T03:19:11.481402800Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "outputs": [
    {
     "data": {
      "text/plain": "[{'loss': 0.36084355672184654, 'acc': 0.8712, 'step': 33000},\n {'loss': 0.35720211475754315, 'acc': 0.8724, 'step': 34000},\n {'loss': 0.36683890228263866, 'acc': 0.8709, 'step': 35000},\n {'loss': 0.36297369616243025, 'acc': 0.8713, 'step': 36000},\n {'loss': 0.35757329757697287, 'acc': 0.874, 'step': 37000}]"
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "record[\"val\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:19:46.400342200Z",
     "start_time": "2024-07-17T03:19:46.377355Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:28:07.777109600Z",
     "start_time": "2024-07-17T03:28:07.518915700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step\n",
      "0        0.06250\n",
      "1000     0.62500\n",
      "2000     0.71875\n",
      "3000     0.71875\n",
      "4000     0.75000\n",
      "5000     0.87500\n",
      "6000     0.78125\n",
      "7000     0.87500\n",
      "8000     0.90625\n",
      "9000     0.75000\n",
      "10000    0.90625\n",
      "11000    0.84375\n",
      "12000    0.84375\n",
      "13000    0.84375\n",
      "14000    0.93750\n",
      "15000    0.75000\n",
      "16000    0.81250\n",
      "17000    0.87500\n",
      "18000    0.93750\n",
      "19000    0.81250\n",
      "20000    0.93750\n",
      "21000    0.93750\n",
      "22000    0.75000\n",
      "23000    0.75000\n",
      "24000    0.90625\n",
      "25000    0.96875\n",
      "26000    0.87500\n",
      "27000    0.87500\n",
      "28000    0.93750\n",
      "29000    0.90625\n",
      "30000    0.90625\n",
      "31000    0.87500\n",
      "32000    0.78125\n",
      "33000    0.90625\n",
      "34000    0.81250\n",
      "35000    0.90625\n",
      "36000    0.90625\n",
      "37000    1.00000\n",
      "Name: acc, dtype: float64\n",
      "step\n",
      "0        0.1023\n",
      "1000     0.6786\n",
      "2000     0.7747\n",
      "3000     0.7975\n",
      "4000     0.8043\n",
      "5000     0.8209\n",
      "6000     0.8171\n",
      "7000     0.8307\n",
      "8000     0.8246\n",
      "9000     0.8264\n",
      "10000    0.8391\n",
      "11000    0.8379\n",
      "12000    0.8371\n",
      "13000    0.8385\n",
      "14000    0.8501\n",
      "15000    0.8458\n",
      "16000    0.8459\n",
      "17000    0.8560\n",
      "18000    0.8537\n",
      "19000    0.8543\n",
      "20000    0.8603\n",
      "21000    0.8589\n",
      "22000    0.8596\n",
      "23000    0.8617\n",
      "24000    0.8583\n",
      "25000    0.8635\n",
      "26000    0.8641\n",
      "27000    0.8645\n",
      "28000    0.8657\n",
      "29000    0.8687\n",
      "30000    0.8692\n",
      "31000    0.8628\n",
      "32000    0.8706\n",
      "33000    0.8712\n",
      "34000    0.8724\n",
      "35000    0.8709\n",
      "36000    0.8713\n",
      "37000    0.8740\n",
      "Name: acc, dtype: float64\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 1000x500 with 2 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAHACAYAAABqJx3iAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAADIs0lEQVR4nOzdd3xb9dX48c/V9p7xSpzE2XtDSBgNkMFKmS2F/lgtdJEWSGf6tEDgKSmljLaslpby0JZVZgspJARSIGQvspftOPHeW/v+/riSbMdLsiXLss779dLLtqx7dTylo3O+56uoqqoihBBCCCGEEEOILtwBCCGEEEIIIUSwSaIjhBBCCCGEGHIk0RFCCCGEEEIMOZLoCCGEEEIIIYYcSXSEEEIIIYQQQ44kOkIIIYQQQoghRxIdIYQQQgghxJAjiY4QQgghhBBiyDGEOwB/uN1uSkpKSEhIQFGUcIcjhBBRQ1VVGhsbycnJQaeT18a85HFJCCHCx9/HpohIdEpKSsjNzQ13GEIIEbVOnTrFiBEjwh3GoCGPS0IIEX69PTZFRKKTkJAAaF9MYmJiwMc7HA7WrVvH0qVLMRqNwQ4vqCTW0ImkeCXW0IikWGFwxNvQ0EBubq7v/7DQRNPjEkRWvBJr6ERSvBJraAyWWP19bIqIRMfbFpCYmNjnB5TY2FgSExMj4hdIYg2NSIpXYg2NSIoVBle80p7VUTQ9LkFkxSuxhk4kxSuxhsZgi7W3xyZpuBZCCCGEEEIMOZLoCCGEEEIIIYYcSXSEEEIIIYQQQ05ErNERQgxOqqridDoxGAxYrVZcLle4Q+qRw+GImFhhYOLV6/UYDAZZgyOEEGLIkURHCNEndrud0tJSmpubycrK4tSpU4P+ybKqqhETKwxcvLGxsWRnZ2MymUJ2H0IIIcRAk0RHCBEwt9tNQUEBer2enJwc7HY78fHxg35DSbfbTVNTU0TECqGPV1VV7HY7lZWVFBQUMH78+Ij4vgghhBD+kERHCBEwu92O2+0mNzcXi8VCQ0MDFotl0D9Jdrvd2O32iIgVBibemJgYjEYjJ0+e9N2XEEIIMRQM/kd6IcSgFQnJguid/ByFEEIMRfLoJoQQQgghhBhyJNERQgghhBBCDDmS6AghRB+NHj2aJ554Iijn2rhxI4qiUFdXF5TzRZNPPvmE5cuXk5OTg6IovP32270es3HjRubMmYPZbGbcuHG88MILIY9TCCHEwJJERwgRVa644gruueeeoJxr+/btfOtb3wrKuUTfNTc3M3PmTJ566im/bl9QUMDll1/OhRdeyJ49e7j77ru5/fbb+eCDD0IcqRBCiIEkU9eEEKIdVVVxuVwYDL3/exw2bNgARCR6c+mll3LppZf6fftnn32WvLw8Hn30UQAmT57MZ599xuOPP86yZctCFaYQQgi0x1lgQPazG/KJzqbjVTz47wPEu3RcFu5ghBiiVFWlxe4My/SuGKPe73+Wt912G5s2bWLTpk38/ve/B+Cvf/0rt912G2vXruUXv/gF+/btY926deTm5rJy5Uq2bNlCc3MzkydPZs2aNSxevNh3vtGjR3P33Xdz9913A9o/7eeee4733nuPDz74gOHDh/Poo4/y5S9/uU9f2xtvvMG9995Lfn4+2dnZfP/73+eHP/yh7/NPP/00jz/+OKdOnSIpKYnzzz+f119/HYDXX3+d1atXc/z4cWJjY5k9ezbvvPMOcXFxfYplKNm8eXOHnyPAsmXLfD/HrthsNmw2m+/jhoYGABwOBw6HI+AYvMf05dhwiKR4JdbQiaR4JdbQCEasB0sbuP3FXVw4cRi/umpqv+LozZBPdGwtTbRUnCAxZvDvgi5EpLI63Mx+eH1Y7vvgA8uINfn3r+yJJ57g0KFDzJw5kwcffBCAAwcOAPCzn/2M3/72t4wZM4aUlBROnTrFZZddxq9+9SvMZjMvvvgiy5cv58iRI4wcObLb+1i9ejW/+c1veOSRR/jDH/7A17/+dU6ePElqampAX9fOnTv52te+xs9+9jNuuukmtmzZwve+9z3S0tK49dZb2bFjBz/4wQ/429/+xsKFC6mpqeHTTz8FoLS0lBtuuIHf/OY3XH311TQ2NvLpp5/6XkWLdmVlZWRmZna4LjMzk4aGBlpbW4mJiel0zJo1a1i9enWn69etW0dsbGyfY1m/Pjx/N30VSfFKrKETSfFKrKHRn1g3lipUNunZd+IUa9ee7NM5Wlpa/LrdkE90cqo+4xPzPexxTwT+X7jDEUKEUVJSEiaTidjYWLKysgA4fPgwAA888ABLlizx3TY1NZWZM2f6Pn7wwQd56623+Ne//sWKFSu6vY9bb72VG264AYCHHnqI3//+92zbto1LLrkkoFgfe+wxLrroIn784x+TmJjIpEmTOHjwII888gi33norRUVFxMXFccUVV5CQkMCoUaOYPXs2oCU6TqeTa665hlGjRgEwffr0gO5fdLRq1SpWrlzp+7ihoYHc3FyWLl1KYmJiwOdzOBysX7+eJUuWYDQagxlqSERSvBJr6ERSvBJraAQj1ndf2gNUcPlZE7nsgrw+ncNbVe/NkE909CbtlTmzauvllkKIvrIYdey/f0nYWteCYd68eR0+bmpq4v777+e9997zJQ6tra0UFRX1eJ4ZM2b43o+LiyMxMZGKioqA4zl06FCnlrdzzz2XJ554ApfLxZIlSxg1ahRjxozhkksu4ZJLLuHqq68mNjaWmTNncvHFFzN9+nSWLVvG0qVLue6660hJSQk4jqEoKyuL8vLyDteVl5eTmJjYZTUHwGw2YzabO11vNBr79cSkv8cPtEiKV2INnUiKV2INjb7G6narbD9ZC8DC8cP6/PX6e9yQn7pmMGv96CbsYY5EiKFLURRiTYawXIK1mPHMtSs/+tGPeOutt3jooYf49NNP2bNnD9OnT8du7/l/yZn/fBVFwe12ByXG9hISEti1axcvv/wy2dnZ3HvvvcycOZO6ujr0ej3r16/nP//5D1OmTOEPf/gDEydOpKCgIOhxRKIFCxawYcOGDtetX7+eBQsWhCkiIYSIDkcrGqlrcRBr0jN9eFLI72/IJzpGi9Y7bWbwL/ASQoSeyWTC5XL1ertNmzZx6623cvXVVzN9+nSysrIoLCwMfYAekydPZtOmTZ1imjBhAnq9VsUyGAwsXryY3/zmN3zxxRcUFhby0UcfAVqCde6557J69Wp2796NyWTirbfeGrD4B1JTUxN79uxhz549gDY+es+ePb7q26pVq7j55pt9t//Od75Dfn4+P/nJTzh8+DBPP/00r732WtDGjgshhOjalhPVAMwdlYJRH/o0ZMi3rhkt2qu0FqR1TQgBI0eOZNu2bRQWFhIfH99ttWX8+PG8+eabLF++HEVR+OUvfxmSykx3fvjDH3LWWWfxyCOPcNNNN7F161aefPJJnn76aQDeffdd8vPzueCCC0hJSWHt2rW43W4mTpzI1q1b2bBhA0uXLiUjI4OtW7dSWVnJ5MmTByz+gbRjxw4uvPBC38fetTS33HILL7zwAqWlpR1aDvPy8njvvfe45557+N3vfseIESP485//LKOlhRAixLYW1ABwzpi0Abm/IZ/omGO0RMeMA5dbJTI6H4UQobJixQq+//3vM2XKFFpbW/nrX//a5e0ee+wxvvGNb7Bw4ULS09P56U9/6vfix2CYM2cOr7zyCvfeey+PPPII2dnZPPDAA9x6660AJCcn8+abb3L//fdjtVoZP348L7/8MlOnTuXQoUN88sknPPHEEzQ0NDBq1CgeffTRgPaaiSSLFi3qcaLcCy+80OUxu3fvDmFUQggh2lNV1ZfozM8LbBJpX0VBoqO1rsVgo9npwtJ5LakQIoqMGzeOTZs2dRic4E0e2hs9erSvDczrzjvv7PDxma1sXT3Zrqur8yuurp6sX3vttSxZsoTExMROgx7OO+88Nm7c2OW5Jk+ezPvvv+/X/QohhBAD4VhFEzXNdixGHTNGJA/IfQ75NTpmSwIABsVNq1Xa14QQQgghhBhoW/O19TlzRqZgMgxMCjLkEx2dqW1UqN3aHMZIhBDR7Dvf+Q7x8fFdXr7zne+EOzwhhBAipLYM8PociILWNQxm3CjoULG1SqIjhAiPBx54gB/96Eddfq4vG04KIYToXovdiav7pXtigKmqytb8gV2fA9GQ6CgKNkzEYMNhbQl3NEKIKJWRkUFGRka4wxBCiCGvuK6Vy3/3KdlmHcsvD3c0AuBEZTNVTTZMBh0zc5MH7H6HfOsagA0TAE6bVHSEEEIIIYayf+44RV2rg0N1OmpbZMP4wWBrgXd9TjIWo37A7jcqEh27oo1ac9ikoiOEEEIIMVSpqsqbu4p9H28vrA1jNMKrrW1t4NbnQLQkOjot0XFKoiOEEEIIMWRtL6ylqKbt+d42SXTCTlVVtngmrs0fM3DrcyBKEh2np6LjsrWGORIhhBBCCBEqb+w8DUBGgvbcb1uBJDrhVljdQkWjDZNex5yRKQN631GR6Dh0FgBcdqnoCCGEEEIMRa12F+/tKwXg55dOBOBweSP1LY5whhX1vPvnzMod2PU5ECWJjtPTuuaWREcI0U+jR4/miSee8Ou2iqLw9ttvhzQeIYQQmnUHy2iyORmREsOlUzPJsKioKmwrrAl3aFEtXG1rECWJjkuvVXRUh7SuCSGEEEIMRa972taumTMCnU5hXKK2kY63oiAGnqqqbA3DRqFeUZHouPVaRUd1WMMciRBCCCGECLayeiubjlcBcO2c4QCM9SY6BVLRCZdTNa2U1lsx6pUBX58DUZLoeCs6SEVHiNBQVbA3h+ei+r/19Z/+9CcmT56M2+3ucP2VV17JN77xDU6cOMGVV15JZmYm8fHxnHXWWXz44YdB+zbt27ePiy66iJiYGNLS0vjWt75FU1OT7/MbN27k7LPPJi4ujuTkZM4//3yKiooA2Lt3LxdeeCEJCQkkJiYyd+5cduzYEbTYhBAikr21uxi3CmeNTmFUWhyAr6JzoKSeBqus0wkHb9vajBHJxJgGdn0OgGHA7zEMVEOM9o4kOkKEhrMV3a8nh+e+f14Cpji/bvqVr3yFu+66i48//pglS5YAUFNTw/vvv8/atWtpamrisssu41e/+hVms5kXX3yR5cuXc+TIEUaOHNmvMJubm1m2bBkLFixg+/btVFRUcPvtt7NixQpeeOEFnE4nV111FXfccQcvv/wydrudLVu2oCgKAF//+teZPXs2zzzzDHq9nj179mA0GvsVkxBCDAWqqvLGLq1t7do5I3zXJ5thVGosJ2ta2FFYw0WTMsMVYtTa4tko9JwwrM+BqEl0tIqO4pRER4holpKSwuLFi3n55Zd9ic7rr79Oeno6F154ITqdjpkzZ/pu/+CDD/LWW2/xr3/9ixUrVvTrvl966SWsVisvvvgicXFaYvbkk0+yfPlyHn74YYxGI/X19VxxxRWMHTsWgIkTJ9LQ0ABAUVERP/7xj5k0aRIA48eP71c8QojQcrlV/rW3mHPHppORaAlrLEXVLew9XccVM7J9L54Eqtnm5OWtJ9l1WqFgYz56XddNQTnJMVwzZ3if76cvvjhdz/GKJswGHZfNyO7wubPzUjhZ08LW/NAkOv/eW8K4jHgmZycG/dxDQbg2CvWKikQHo1bR0TlljY4QIWGIwf2z0+i6eeALKWNsQDf/yle+wt13380zzzyD2WzmH//4B1/72tfQ6XQ0NTVx//33895771FaWorT6aS1tdXXPtYfhw4dYubMmb4kB+Dcc8/F7XZz5MgRLrjgAm699VaWLVvGkiVLWLx4Mdddd53v9itXruT222/nb3/7G4sXL+YrX/mKLyESQgw+r24/xc/f2sc1s4fz2PWzwhaHqqrc8eIOjpQ3khRj5IIJw/p0nr9vOcma/xwB9Kw9dbzH245Ki2Xe6IF7Bd9bzVk2NYtES8dK9/zRKfxzZ7GvhSqYPjlayfdf3k2C2cB7PzifkWmBPR4NdadqWiiua0WvU5g7auDX50CUrNHBqL2SonPZwhyIEEOUomjtY+G4BPiq4SWXXIKqqrz33nucOnWKTz/9lK9//esA/OhHP+Ktt97ioYce4tNPP2XPnj1Mnz4du90eiu9aJ3/961/ZvHkzCxcu5NVXX2XSpEls374dgPvvv58DBw5w+eWX89FHHzFlyhTeeuutAYlLCBG4T45WAnCkvDGscXxxut4Xw+6iuj6fZ88p7dixCSrXzxvBDWeP7HQZkaK9sHy8oqmHMwWXzeniX3tLALh27ohOnz87T0u49pc00GRzBvW+/+mZ8tZoc/L9l3dhd7p7OSK6eIdATB+eRJw5PLWVqKjoKJ41OjqXtK4JEe0sFgtXX301//jHPzh+/DgTJ05kzpw5AGzatIlbb72Vq6++GoCmpiYKCwuDcr+TJ0/mhRdeoLm52Vel2bRpEzqdjokTJ/puN3v2bGbPns2qVatYsGABr7/+OhdffDEAEyZMYMKECdxzzz3ccMMN/PWvf/XFKoQYPFRV9e3dUlwX3uce3moHwKHShj6fx3vsshFu7rlySpdrBH/x9j7+vqVoQL/mjw9XUtfiIDPRzHnj0jt9PjvJQm5qDKdqWtlRWMOiiRlBud8Gq4N1B8oAiDHq2Xu6nt+8f5hfXDElKOcfCrxjvcMxVtorKio6ikkrJRqkoiOEAG688Ubee+89nn/+eV81B7R1L2+++SZ79uxh79693HjjjZ0mtPXV17/+dSwWC7fccgv79+/n448/5vvf/z433XQTmZmZFBQUsGrVKjZv3szJkydZt24dx44dY8KECbS2trJixQo2btzIyZMn2bRpE9u3b2fy5DANgBBC9OhYRRM1zVoluK7FQWOYJn61r3YAHOxjotNkc3KyRtt0fXhc95MuR6Roz7dO1w5couNN5K6aPRy9rusKv3d9yJb84I2Zfu+LUmxON+Mz4vn9DbMB+PNnBXx4sDxo9xHpvIMIwrFRqFdUJDp6k1bRMbhljY4QAi666CJSU1M5cuQIN954o+/6xx57jJSUFBYuXMjy5ctZtmyZr9rTX7GxsXzwwQfU1NRw1llncd1113HxxRfz5JNP+j5/+PBhrr32WiZMmMC3vvUtvve973Hbbbeh1+uprq7m5ptvZsKECXz1q1/l0ksvZfXq1UGJTQgRXGduUBmuqs7Hhyuoa3GQEqtVX4pqWvqUdB0pa0BVITPBTHwPwx6HJ2vPt07XtvQp3kBVN9n4+HAFANfN6dy25uWtKGwtCN46nTc8bWvXzh3BkimZfOPcPAB+9PpeSsJcxRsMSupaOVXTik6BeWFanwNR0rqmM3sqOm6p6AghQKfTUVJS0un60aNH89FHH3W47s477+zwcSCtbOoZe/xMnz690/m9MjMzO625cbvdNDQ0YDKZePnll/2+XyFEeJ1ZOSiubWVS1sBP5Xp9ZzEAXz0rl3/tKaG03srhskbOCnBQwMFSbY3PpKwEoLnb23nX6BQPUEXnX3tLcLpVZoxIYnxmQre3m+9Zp7PvdD3NNme/14sUVjWz42QtOgWunq1tTvrTSyeyvbCGfcX1/ODl3bzyrXMw6KOintAlb1I5fXgSCZbwbYUQFT8Bb0XHqA7MgmIhhBBCRCdVVX1P8tLjzcDAtnJ5VTfZ2HikrdrhHX/cl3U6B0u0YyZnd59MQFvrWlmDdUAW5ne1d05XclNjGZ4cg9OtsvNkbb/v903P/Z43fhiZntHhZoOeJ2+cTbzZwI6TtTz+4dF+308k23LCM1Y6jOtzIEoSHYNnjY5JldY1IURw/OMf/yA+Pr7Ly9SpU8MdnhAiTE5UNlPVZMds0HHJNG3floFq5WrvnT0dqx1T+pHoeI/RKjrdS483YTbocKtQVh/a51xHyhrZX9yAUa/w5Zk5vd7eu06kv+1rbrfKG7u0Stm1c4Z3+NyotDh+fe10AJ7eeMI3eS8aeb/P3mpauERF65rR4k10pKIjhAiOL3/5y8yfP7/Lz3U1jUgIER28+7XMGZnCmPR4IDxrdM6sdngrOt7qjL9cbpXDZZ6KTlYCh091f1tFURieEkN+ZTOn61pCuq+M9+u7aFIGKXGmXm9/Tl4ab+4q9m1g2VdbC2oormslwWxg2dSsTp+/YkYOn5+o5qWtRax8bQ9rf3B+2DeMHWjlDVYKq1u09TkDuJ9SV6Ik0dFGuZpVWaMjhAiOhIQEEhJ6fnVTCBF9vHuHzB+TyvAU7+L8gU10Dpc1cKCkY7VjSk6i53ONOF1uv9ePFFY3Y3W4sRh1jEqL5XAvtx+e7El0Qvg1O11u3trtrar03Lbm5a3o7D1dR6vdRYxJ36f79iZYl8/IxmLs+hz3XjGFXSdrOVzWyN2v7uFv35zf7US4ocib7E/JSSQpJrwv/EVF65rJU9GxYO+0OFgI0Xfy9zQ0yM9RiOBQVdU3cW1+XtqAL8738k4Ea1/tGJUaS6xJj83pprC6+4ECZ/JWgCZlJfr1ZH0gRkx/eryKykYbqXEmv/fFGZkaS3aSBYdLZVdR39bptNid/GdfKdD15qReFqOeJ2+cQ4xRz+cnqnn64+N9ur9I5R3G4R3rHU7RVdHBjs3p7jYDF0L4x9ua1dLSgtlsDnM0or9aWrT1A9JyJ8LpdG0L9//rANfMGcFl07P7fJ7HPjzGoUIdl4YhgS+oaqai0YbJoGP2yGRsngX51c12WuxOYk2hf9qlVTu0qZLtqx06ncKkrAR2FdVxsLSRcRn+VaS963O8rW+9GYjk7k3PGpkvz8zBZPDvNXtFUZifl8rbe0rYml/NuV1sLtqb9/eX0Wx3MSottteRyeMy4nnwqmn86J97efzDo7znSZC6oqoqSW4di+xOkkL4f/iZjScormth9Zen9bnC9OnxKn77hZ6n8z9HUbo+x8lq7TElnBuFekVFomP2VHTMipNaqx2LMSbMEQkR2fR6PcnJyVRUVOB2u3G73VitVnS6wV0kdrvd2O32iIgVQh+vqqq0tLRQUVFBcnIyer28CCTCw+50c+dLu9l7qo7yBlufE53qJhvP/LcA0LGrqI5zxvn3an+weNvWZuUmYzHqsRj1JJgNNNqcFNe29jgCOVg+PVZFVVPX1Y7J2YlaolPS4NcCfmjbZNTb+tabESmh30tn8wmtarZ8ZmC/J/PHpPH2npI+bxzqbVu7ZvaIbp/kt3fd3BFsK6jmtR2nOVzW2Mutdax+9zCPXT+7T7H1ptXu4pEPDuNW4apZw/u8duaPnxRwqlmB5qYeb5dgNnB2mAcRQJQkOgZPRQfAZm2GBEl0hOivrCxtEWZlZSWtra3ExMT49Y8/nFRVjZhYYeDiTU5O9v08hQiH3647wt5TdYBWFVFVtU+/8wVVbS1Zb+0pGfhEx9O2dk67J3jDU2I4XNbI6bqBSXRe9zwZ76ra4U1WApm85r3tlF5GS3uNCPG6pAarg6ombc31hAC/n94Kw55TdVgdroA6fErqWvnck2Bdc8a0tZ48fO0Mbpw/iiars9vbnK5pYtVb+3lzdwnnjhvWY1tcXx0pb8TtKXJuya/uU6JjdbjYfaoegN9eO42s5Lhub5s3LC7s63MgShIdDG3TLqwtTUDg5UohREeKopCdnU1KSgobNmzgggsuGPStTw6Hg08++SQiYoWBiddoNEolR4TVR4fL+dMn+b6Pm2xOKptsZCQEPqkqv12i896+clZfGdiT2f5QVdVXKWjfsjMiJVZLdAZgnU59i4P1B8sBrZpwJt/kNT8TneomG+UNNhQFJmYlAr23A7bfSyeQoQf+KvT8jIclmAPeiHJ0WiwZCWYqGm3sLqpjwVj/W6ve2l2MqmrjknNT/Z8mpygKs3KTe7yNw5HEJzu+YO0pPb98Zz8zc5MZlxHv9334o/20va0FNazowzn2nqrD7nSTYFT58sxsTKbep92FW3QkOooOq2rEojhwWAd+lr0QQ5ler8fpdGKxWAZ98hBJsULkxStEoErrW/nha3sBuHXhaD46XEFRTQsFlc19SnTaV3SabE7WHSz3u0Wrv4pqWihrsGLUK8we2bZ+YyBaubze3VeC3elmYmYCU7toNZuUlYCiQGWjjcpGG8MSel5jeahUa7calRpLvNmAw+HoNYZh8WZMeh12l5uyBqsv8QkW7884L737akJ3FEVh/pg0/r23hC351X4nOqqqto3rDkG1BWDJcJVaYyqb82tY8dIu3r7z3KAm6e2reDtP1uJwuTEGmIR6WzPHJfat4hoOg79JPUhsaFmnzer/pBEhhBBChIbT5eaul/dQ2+Jg2vBEVl02yffktX3CEoiCSu24BKNWefBOHxsI3v1ZZo5I7jC6eCAnr3m/3mvnDu/yiWisyUBemvY99qd97WCp1qbk7/oc0IYe5CRrSWoovuZ8z894TB8SHWjbwDKQjUP3nKojv7KZGKO+X4MyeqJT4LfXTSc93sThskYefPdgUM/fvorXYnexr7g+4HN4v2djEyNnUmf0JDqKlui4JNERQgghwu53G46xrbCGeLOBJ2+Yg9mg73+i4zluyXBt2tmnxyqpaLAGJ+BeePcOOXPSVKjXrHjlVzaxq6gOnaItNu/O5ADW6XgrOpOz/E90ILQjpvtT0YG2n8/uIm2djj+81ZxLpmURbw5dM1RGgpnHr5+FosA/thbx7hclQTmv261y2PPzHjNM+755f1/9ZXe62XlSG8s9ThKdwcdb0XHapXVNCCGECKfPjlXxpGdvkYeumc5oz5NW75Ow/D4kOm63SoFnf5ipKSqzc5Nwq/D2nuIgRd2z9huFtjc8OfT7ykDbyOULJgwjI7H7tr8pAazTORTgxDWv4cmhS+76m+iMHRZHerwZm9PtG4DRE5vTxb/3evbO8XNz0v44f/wwvrdoLACr3tjHyQD2POpOUU0LzXYXJoOOG84aCbRVIP31xek6rA43KbFGsiJoplfUJDoOb6Ija3SEEEKIsKlotHL3q3tQVbjh7NwOa2j6U9EpqW/F7nRj1CukmuHq2dp539hZHPJNcU/VtFBc14pBpzD3jP1VvBWdqiab3xWEQLndKm/t1hKd3p6MexOd3io6NqeL4xXaCGF/99Dx8rXr1QX3OZeqqr7fDW9SHCjvfjrQlpz2ZMOhCupbHWQnWQIaXtAf9yyewLxRKTTanKx4aTc2Z/9+b7w/64mZCSwcp30NOwprcLrcfp/D+706e3QKEbI8B4iiRMfXuiYVHSGEECIs3G6Vla/uparJxsTMBO69YmqHz3sTnZPVzbjcgSUn3ifAI1Nj0Slw+bQsTAYdR8obOVDi/zjlvvA+CZw+IqnTpqDJsUbiPGt2iutCU9XZkl9NcV0rCRYDS6Zk9nhbb9JyorK5x8TrWHkTTrdKcqyR7KTABkOMSA1NRaeyyUaTzYlOIaDJZ2c6Z4z/63S8656unj28z5tsBsqg1/H7G2aTHGtkX3E9D//nSL/Od9C36WsCk7ISSbQYaLa7Avq78La6DYa9cQIRNYmOw5fohH4xoBBCCCE6e+a/J/jseBUxRj1P3ji7w6J9gJykGEwGHQ6XGvBCdl9LU5r2BDgxxuh70v96iIcSdLc+B7QKwvAQr9N5w9O2dsWMnF4ndWUmmkmNM+Fyqxwr737TR9+T46zEgCdshapdzztsYkRKLGZD3yeSzff8nHaerMXu7L6qUdloY+PRSiB009a6k5Mcw2+vmwnA85sKfGPD+6JtL6RE9DqFs/O0r9/fdToOV9v6nPmjU3q59eASNYmO05PouKWiI4QQQgSk1e7C1c/ur20FNTy6Tntl+oErp3a5eaZOp/imguVX9bzz+pm807hGt1u7cZ2njetfe0t6fELbX97KwPxuXu32Ls4PxRSyZpuT/+zX1pBcN7f3jSwVRWGyZ/NP71S1rvR1fQ60ta6V1rcGXJnrSX/X53iNz4gnNc6E1eFm/cFyTlQ2dXn525aTuNwqs3KTGTssuPva+GPxlExuPy8PgB/9c2+fK4LePXS81by2ipZ/63T2FdfTYneRHGtkfJD39wm1gEZHrFmzhjfffJPDhw8TExPDwoULefjhh5k4cWKPx/3zn//kl7/8JYWFhYwfP56HH36Yyy67rF+BB8pb0cEhFR0hhBDCXycqm7j0d58yL1XH8j6ew+1W+eE/9+BW4ZrZw7vczNIrLz2OI+WNFFQ1s6jnpxcddKjoVGjXnT8+nWEJZu2V+SMVLJ2a1cevoHvFda2cqmlFr1O63W0+lHvpvL+/jBa7i7z0OOaM9O/V9inZiWw6Xu2bqtaVM58cByIz0YJBp+BwqVQ0WslOCs7q9WAlOt51Ov/ZX8adL+3q9fYDXc1p7yeXTGJ7YQ17T9dz79v7+cutZwV0fF2LnZJ6bfKgd+LefE9FZ3tBDS63il51gq0R7E1gbwaDGSzJYEkCnb6tbW10KrpA2vdUFax1UH+660vmVLjisYC+nkAFlOj897//5c477+Sss87C6XTy85//nKVLl3Lw4EHi4rr+pfv888+54YYbWLNmDVdccQUvvfQSV111Fbt27WLatGlB+SL84U10VEl0hBBCCL9tPFKpjZatUnC63PRl79qjFY2cqmklxqjnwaum9dgKlTesbwMJvLcflRZLtSfRMeh1XDUrh+c+LeCNXadDkuhs9TwJnDY8qdvRw94pZKFYo+MdfXzN7K73zumKN3k52M0aDVVVfRUdb/UnEHqdQnayhVM1rZyubQ1aopPfz0EE7X19/ij2nKqjxd7zQv/RabFcOWtgNp3tismg4+HrZnDJE5/y6fEqrA5X5/ZEtwsKP4OTn4OjBVx2cNrA5cBR18DTxjISjSqJ//wzOFqZZmvkU3MlMbSi/MoGLlv3AZgT+arTwiJTDCk16ej/mcmcynr0b78DuMHtBJdTe+t2aLG4HG0Jjr2Hyqy79w1o+yugROf999/v8PELL7xARkYGO3fu5IILLujymN/97ndccskl/PjHPwbgwQcfZP369Tz55JM8++yzfQw7cE6dVHSEEEKIQHmf8NrcCgdKG5mXZw74HFtOaMnAvNEpxPWyD4m3dS2QRMfmdPmqJXnpcbRfeXDt3BE892kBHx2uoLbZTkqcKbDge+Ed03tOD4u0Q7WvTHFdK5s9idbVc3pvW/Oa0m4vHVXtvMt9cV0rDVYnRr3C+IzAEx2AEcmxnKpppbi2lbNG9+kUnQSrogNw3vh0Nq+6uN/n6cDeDLUnoe5kx7cNxVri4XZoSYjLqb11O8DlwOBysEwXg96+GMYvgTEXQmLbxqQTMxPISDBT0Whjd1GdNv3N7YKizbD/TTj0L2iu7DKkYcBlesANnNCuU4Bc74+8fZ5nsIApTovVm6DYGkingXQd2tdTB7kAtQF8X2LTIWk4JOVC0oi2S0peACfpm37telRfr/V2pqZ2/8e9efNmVq5c2eG6ZcuW8fbbb3d7jM1mw2Zryy4bGrR/sg6HA4cj8OzP4XDgalfR6cs5Boo3tsEco1ckxQqRFa/EGhqRFCsMjngj5XslQqf9q/7bCmuYl5ce8Dm8awG6Wqx/Jm9Fx7vmxh+nalpwqxBn0jMsvmMiMykrkak5iRwoaeBfe0u4ZeFo/wP3g299zpieEp3QtK69tes0qgoLxqT5kil/jB0Wj0mvo9Hm5HRta6cJZt6WtrHD4jEZ+racO9hfs8ut+vaU6Vei43ZrFQyXHZz2dpUIZ1s1on11wmkFW5P2xN/W0O79Jq3dy9YADSVaEtBNstEbBbC4HXDgTe0CkDEVxl0EYy9CGbmQ+WPSeHfvaU7t+ZAFR3bAwXegqd2AgpgUGL8M4tK11jO9CfQm3tlfzfbTzXxpUg5LZozUkhlzPG8fbODpzRXMGpvLb25cAOYE0Lcr17ocYK3nYMEpVv3jE7LMNp65dixqSw2H9u5g8pSp6I0W0OlBZ9CO1Rk8Hxu18yXlQmIOmPo+Ia+/+pzouN1u7r77bs4999weW9DKysrIzOw46jAzM5OysrJuj1mzZg2rV6/udP26deuIje3bNytWp/3wWuoqWbt2bZ/OMZDWr18f7hD8FkmxQmTFK7GGRiTFCuGNt6VFBrhEM7vT7dtLBWBbQS3fuzCwc6iq2raZph+jab1PYkvqW7tu0+mCNynKGxbXZfvWtXNGcKDkIG/sOh3URKes3kphdQs6hW7X5wC+qWsVjTZsTle/JoZ5qarqm7YW6BoSo17H+Mx4DpQ0cLC0oVOi401u+zKIwKtPk+ZcDmiu0tqeErIhJtn3qeLaVhwuFZNBR05XrXCqCjX5cHo7nNqK4dR2ltSUYDj6I08VxdPOpYZmLyMfSxIkj4KUUZ63o7XqhTFWSwb0Jk9iYPJ8bMThVtjy/qsszGhFX/AxlOyBigPa5fM/gCGGnyfN4H/MR8naV9vxviYth6lXw5gvdUxUPP6461MOuho4f85caNe6mWeu4+jnmygvNvJrS0rntTd6I8Sl82l1PXvVcQzLy0A3/SwcDgcnyjKYOP8y9H3pYx1gfU507rzzTvbv389nn30WzHgAWLVqVYcqUENDA7m5uSxdupTExMD/6BwOB/899g4AiTEGzhngQQiBcDgcrF+/niVLlmAc5L9AkRQrRFa8EmtoRFKsMDji9VbURXQ6UdmEvd2mgjtO1mmLlwNYkHysoomaZjsWo44ZI5J7vX1anIkEi4FGq5OT1S1MzOq9daqtpanriVBXzsrhobWH+OJ0PcfKG7uc+NYX3mrO1JwkEi3d/42mxZmwGHVYHW5K66wdJsP11a6iOgqqmokx6rlkWuBrjyZna1WugyUNLDtj7VL7ccSoKlQehoJP0J/azqyScnTrP4fYVLAkgjlRe8Jt8bw1xIDLxgxOMV85REpZIRw+rVVGnDbtbWutVv1oqoDmCu1tUwW0njEFLDYd0sZB2jic7kwu0bkgeQw6ZysoCpTshlNb4ZSW3NBS5TtUAWIBeitK6wydL+2rE3qzVp0wx4MpXvt6fe/HgykBErLaEpt2yZnfHA5q4ifiXnQZ+iX3QXM15H8MJz7SLo2lZFdvBQUa1FjiZl6Jfto1MGYRGLpvxWz/QsWUM4ZKTM1JJN5soL7VwaGyBqbmJHV5jkCqsYNRnxKdFStW8O677/LJJ58wYkTPryJkZWVRXt5x9nd5eTlZWd3/UZrNZszmzj3ARqOxzw/2bk9Fx+CyRcQTnP58rQMtkmKFyIpXYg2NSIoVwhtvJH2fRPB5n/DOHZnMgeJammxODpY0MH1E10+KuuJdrD93VIpfbVCKojAmPY69p+spqGoKMNHpOoFIizezaGIGHx4q5/Vdp1l16WS/4+/Jlnz/KlWKojAiJZbjFU2crm0NSqLjHUJw6bQs4vVuLSEJYL8b7xNf78+4vdrio1yv38mVJ16GLVu1ZARtT5JRANs+6fX8FwEXmYFK4BW/wwJFpyUW1notcWmpglNbGAM8awKagId+AIq+c3VGb4LsmZA7H2f2HDbtL2LhBYswmuO0hEBv0hIX3/umgL5nAyYuDaZfp11UFSoOoZ78nHver2JtyyT+PvsCvzbu9L5QkWA2+FoJvQx6HXNHpfDfo5Vsza/pMtFxuVW2+6qxUZDoqKrK97//fd566y02btxIXl7vi4gWLFjAhg0buPvuu33XrV+/ngULFgQcbH+4dVripHdbB/R+hRBCiEjVvoWptaGGg3UKWwuqA0p0tvThiVKeJ9HJ93MggW8aVw8JxHVzh/PhoXLe3l3MT5ZNCsou994kbr4fr3YPT47heEUTxXX9bwe1Oly8u7eYs5VD/Lzp/+BX67Un/glZEJ+pvU3IgvistvdjUtq1cNk511HFFbqDZJ1SYOcBrdpSthd3/ie8ai0CI1DouUNDDIw8B9eI+Rw5dpyJo7PR25u0ZMTWoL21et46W8FgwakzcbLOiV0xMWnEMBSDxZNgmLWqR9wwLdb4DM/7GdrHMamg02nrX6pPQM0JqD7Bnj07UauPM8lYQYyrQUty4rMg92zPZT5kzQCjBQDV4aCuYC1kTqNPowIHC0WBzCkomVNwHNuFfV8pW/Or/Up02ibndb3p6zlj0rREp6Cab5zX+Tn9wZIGGm1OEsyGfrUxhlNAic6dd97JSy+9xDvvvENCQoJvnU1SUhIxMVqmePPNNzN8+HDWrFkDwF133cWXvvQlHn30US6//HJeeeUVduzYwZ/+9Kcgfyk9c3umrul7GqEnhBBCCJ9DZZ4nSlkJ1JeoHKzTqhi3nz/Gr+NVVfVNJfNnfY6XtwWtwM+BBP5M47pwUgbJsUbKG2x8dryKL00Y5nc8XalosJJf1YyiaPuL9GZEX9asdMVp4/D7f+El9x+ZZi6EU57rVTfUn9IufpgIPGlCa+36d9v1OsCh6jmgm8CsC74MeRfAiLPAYMbtcHCscS3jL/JjfYbLzdJfvo/LrbLt+ovJSLQE9nWaEyBnlnYBHj2+lU9Lq/jNl2fw1SlxWgtcQvbgrMiEyPwxqby3r5QtBdV8n/G93r63tVbz220c6narndbpeFszz8pLDcoLA+EQUKLzzDPPALBo0aIO1//1r3/l1ltvBaCoqAidrq00vXDhQl566SV+8Ytf8POf/5zx48fz9ttvD+geOoBvgZZBKjpCCCFEr1RVbds0MiuBqkRth/ttBdV+r9M5UdlMVZMNs0HHzNxkv+87kL10Gq0OKhu1FzF7agkzG/R8eWYOL24+yRs7T/c70fGuXZiclUhS7BlP+p022P032POStvFi1nS+ZB/GFsVEcU0f9/JpLIcdz8OOvzCruRJ04FDMGOfcAGfdoa2PaSyDpjLtbYf3y7Vqi97omchlBL2ZXSUtNDkUpo/KICUhDlJG86F1Ej/43MI5k0by/IWBbU7ZnkGvIyvRom2oWtsaeKJzBu/AiTHpcdr6oCjkXSez82Qtdqe711ZQ3wsV3eyFNH14ErEmPXUtDo5WNDIpq2NC5G9r5mAWcOtabzZu3Njpuq985St85StfCeSugk7VaxUdo1sqOkIIIURvyhts1LY40OsUxmfEURCvjW9usDo53MPi5fa8rwjPHpns1/Q0L28Lmj+JTmGV1gqWHm8iKcbY40j0a+eM4MXNJ/ngQBkNVkePAwR6syW/i7HS3gTn08e0vVO8TmxgKbDUDLbDZvjTVMiajm7YFIY1VKMUxoNer1VlVBVQQUV767LDoX/D/je094FSNZUXnUv56nf+h7zckW33k5wb0Nfw9P9t58NDFdw/eQq3nqu1Lm148wtaONVp8XpfDE+JobiuldO1LcwdldLn81gdLkrqtUpYMPbQiVTjM+JJjTNR02xnX3Edc0d1n4C0f6FiSnbXf6tGzzqdT49VsTW/pkOi43KrbCvwvzVzsOrXPjqRRPW0rplUSXSEEEKI3hws1fbKGzssDrNRj16BuaOS+eRYdbeLl8/U1rYW2BMlb2WmutlOfYujc8WknfwqbaqUP0+AZ4xIYlxGPMcrmrj37f2MHdb1lDZ/fHRYW6B/zpi0rhOchBw49wfagvfy/TQV7UEpP0CcYoOSXVCyCz2wEHwbOfZqxNlsSLqGb+/MYfrIdH7aPsnpgynZiXx4qIKD7QYS+Kp4QUh0RqTEsK1A24C0P4pqWlBVSLQYSA3yhq+RRFEUzh6dyvsHytiSX9NjotPhhYrM7n/PzxmTpiU6BdUdRq8fLmugweokzqRnWoSuz4EoSnQUvSQ6QgghhL+8m0a2f8J79uhUPjlWzZb8rhcvt6eqqq/qEeho2nizwbcTfEF1M7Nik7u9rT/rc7wUReG6uSP49X8O8/aekoBi6opFcXBe7Tvw+991THDOXwmzb/ItjAdoabAy/6H15OnKWXdDKoaKA7hLv6Dp9AESEhJQFL1nvYmizUZGaft42CQ4+1uow+fwyO8+xUkj184JbO+crkz2TV7TftZOl5vDZdr7wVh87t3EtL/rktr2SYrvclF9NDlnjDfRqebOC8d1e7v2L1T0VE31tqVtza9BVVXf99f7IsW80akY9H3bNHYwiJpEB1+iYw9zIEIIIcTg19b20i7RydPaj7YVdr14ub3C6hYqGm2Y9Dpmj0wO+P7z0uO0RKeqiVk9rO/psIdOfTG6Tx5lwfEt6F9/1bPPS0LbnifmRL4RH0vGjEbqHAYcihmnzoxDZ8apmHDozDgU7WMVHWZ3MzGuJsyuJmJcTVjczVhcjVhczcQ56zinaT0xH3o2QO8mwfFKjzdjNBjId2ZTOvxCcqdfg8vh4OO1a7nsssv8GuV+oLiew2WNmAw6ls/ICfh7eiZvMnOkvBGny01hdTM2p5tYk55Rqf3fzX5EcnAGMPh+xmn9jynSzW+3TsfhcmPsJgnp6oWKrswYkYzFqKO62c7xiibfHlNdtmZGoKhJdBSD9g/Egq1DxiqEEEKIztqPpvWalpPY4+Ll9ryjl2flBrY+x2vMsDi2FtRQUNXzOObCqmYSaGFp2Z/gD/+H3tlKBsCRA13e3gRcE3A0PeglwfHS6RRGJMeQX9XMqdoWcvuQSLy5S6saLZmc2WM7n79yU2KJM+lptrvIr2r2VXMmZSX0mMT6yztprri2fyO1C3ztiX1vNRwqJmYmkBxrpK7Fwf7iemaP7HrtU1cvVHTFZNDW6Ww6Xs2WghrGZybgdqtsK4zsjUK9oifR0Wv76FiwY3O6+/RPVwghhIgGLXYnBdXaq+jtE532i5e3nKjuMdFpa1vr2yvCeX4MJFCdNs6pep3nza+Tdlh7ku7OPYe9yjRmTJmA3tkCtiawN2lvbQ1t7ztatRHFTmvH993Ojndi0ipBWJK0CpElqe3jrOkw84YeE5z2hqdoiU5fKhwOl5t39miJzrVzhwd8fFd0OoXJ2YnsOFnLwZIGX6ITjPU50LF1rT8vMvsqOsOidxCBl06nrdNZd7CcLfk13SY6Xb1Q0Z35eWlaopNfzU3njOJoRSN1LQ5iTXqmD/d/z6zBKGoSHZ2ndc2iOKi3OyXREUIIIbpxuKwRVYVhCWaGJZg7TDJrW7xc45vUdSZVVX3jl+e3X6zfWAajFsLIBWCM6fJYL99eOp5X88+4Azj4Nu7197OKQlDAnTYe3ZLVuMYsoeg//2HaXD/2eumKy6lteul2gikB9MF7qtRW4Qg80fnvkUqqm+2kx5u4YHz/RmO35010DpU2BHV9DkBWkgVFAZvTTVWTnWEJ5j6dp8CPDWGjyfwxaaw7WM7Wgmq+u2hsp89390JFt+c7Y53OlhPaixRzR6V02xoXKaIm0fGOlwawWptJiuvbH5sQQggx1PXU9uJ7UlRQ0+2r9KdqWimtt2LUK8yz74Cnf67tcO+lN2k72Y/5EuQtgpzZnRIKX0Wnsrnj/Zz8HNb9Eop3oAcq1SReMN3Aj7/3K+0cPYyX9oveAPqu9x3pr/4szn9j12kArpw1PKiLw71JzcHS4Fd0TAZtL53SeivFda19SnTqWx1UNWnrq3vaJymaeP8GdxTW4nS5O/0+nPlCRW9m5iZjNuioarKRX9Xse5Ei0tvWIIoSHXe7RMfW0gxpkb24SgghhAiVntpevIuXa5rtHKtoYkJm56RgS341o5QyHo17BfNr27Qr4zK0xObk59qEssJPtQv/q7WCjT4PRp+vtYG1VJPXVM3jxn2kqI04n12D0VYDLTVa6xmAMY79o2/hq/vmMXfkiKBWXkJluGdxfnFdYGtW6lrsbDikjbMOxrS19rw/450na2mxu1AUbY1OsAxPjqG03srp2pYeh0p0p9BTzclIMBNvHvw/44EwOTuRBIuBRquTAyUNnTbj9f79+rsXksWoZ/bIZLbk17Alv7qtGhvBG4V6Rc9vjKLDgQEjTuy23jcgE0IIIaKVd1+VrlqY2i9e3ppf3TnRsTWRtmUN60yvYrY7QWeAc74LF/xEW+OiqlB9AvI/hoL/QsGnYK2DI2u1i4ceuNrbZV7e7vyKHubcDIt+xruf1dHCiYhpafK2rgVa0fn33hLsLjeTsxOD1lbmNTEzAZ0CLXYXAHlpccSagtuut+NkbZ8nrwUyPjxa6HUK8/NS+fBQBVsLqjslOn3ZC2l+Xhpb8mv4+5YiaprtWIw6ZoxI7vW4wS56Eh3AiklLdFol0RFCCCG64nKrHPGu1chOgEPvYvjwPi5uakLf/ApkTuamuBRqFR07T6Ry04LR2oGqCvteh/W/5OLGUlCgJvt8Uq95DIZNaLsDRYH0cdrl7DvA7YKyLyB/IxRtBZ0eYlMhJpVXDrSwo1Jh+TnT+dKsSdr18ZnaqGigoEpr54qUJ8He1rXSeitOl9vv4173TFu7dk5whhC0F2PSk5cex4lK/9d0BML7NfdlXRJAvnd9jgwi6GB+XpqW6OTX8K0LOq7TOdTDCxXdOWdMGr/bcMx37NxRKZgMkb0+B6Is0bErZlBbcFj7N+ZQCCGEGKpOVjfTYneRYrQzZssvYNcLKEA8wNG1cHQtlwCXmMF9XEH93WiUYROhpRpOb9fO4c7gf10388QtPwNLLwMBdHptjU7O7E6fOmI9wOtlhaTqx/Cl3MmdPt82jSsyxg5nJJgx6hUcLpXyRhsZcb0/DTte0cTeU3XodQpXzgp+ogMwJSfJl+gEu2I03FfF6ttzL6nodM27v822ghpcbhW9Zxy42622DZXI9r8FcfbIZEx6HXZPAj4/L/LX50BUJjrgtEuiI4QQQnTlUGkjU5VC/mh6Gp1nAbzrnBVsrYxl/thk9NXHcFceof7kPlKURqgt0C4Axlj2jf0W1+2ZxZSRGcT1luT0wtuSll/ZuRPD5VYprG7pcLvBTqdTyEmO4WR1C6drWsiI6z2p8A4hWDRhWJ+nlvVmcnYC/97b9n4w+SbN1fW1dU320OnKlOxEEswGGm1ODpU2MM0zBvpkTQstdhdmg47Raf7/XViMemblJvv2zxkK63MgyhIdh6L9g3BKRUcIIYTozO0mdufTvGV6CpPLBQnZcPWzuHPPpXLtWtxnaSObdcB3/7SZo/mFPHyBiSXDasFaDzO+xovrqrBxOiivCPc0YrqkrhW7041JryMnuedR1YPJiBRPolPbypzcnhMdl1vlLW/b2tzgDiFor/2i9SnZwd03pT976aiqSkGlVHS6YtDrmDc6hY+PVLIlv9qX6HjX50zKSgh4Ot85Y1LZVliD2aDrtO4nUkV+810AHDot0XHbZY2OEEII0UFjGfz9Gi48+XtMiouijAvhu5/DmEVd3nx+Xho1JPLv+jFw1u1w/g8haXi7/XP6/4qwd4PIopqWTmtavC1No9JifW07kaBt8lrvFY7PT1RR1mAlKcbIxZMzQhbTrNxkkmKMTMxMIDMxuFWj7CRtM9UWu4valsBGf1c22mi2u9ApMDI1NqhxDQXzPeOft+TX+K4LZKPQMy2ZkoVep3Dx5Iwhs99kVCU6Tk+i47T1rXwqhBBi8HrqqacYPXo0FouF+fPns23bth5v/8QTTzBx4kRiYmLIzc3lnnvuwWq1DlC0g8zhtfD0Asj/GCsmVjm+Sfmlf9EW/3fDm8hsya9GVVVAq7IU1bSg1ynMG9X1ju2ByE60YDbocLjUTolBpK7daKtw9N5d8sZOrW1t+cxszIbQPfFMjjWx/p4LePXb5wRUcfGHxagnw9NyF+hAAu8ggtzU2CGxMD7YvPvcbC+swe3W/gZ7mpjYm+kjktj4o0X89iszgxdkmEXVb41Lr72qoMoaHSGEGFJeffVVVq5cyX333ceuXbuYOXMmy5Yto6Kiosvbv/TSS/zsZz/jvvvu49ChQ/zlL3/h1Vdf5ec///kARx5GrbXalLTXboFXboDWGpwZ07jc9itedl3MpF5eEZ4zMgWTXkdFo823VmZrgbaj+rScRBL6uT4HtDUt3kTG+6TXq20QQaQlOv6NmG60Onj/QBkQ/L1zupKRaCE51tT7DftgRB8HEkRqMjtQpuUkEmfSU9/q8A0g6E9FB7SkMpjjxcMtqhIdpzfRcUhFRwghhpLHHnuMO+64g9tuu40pU6bw7LPPEhsby/PPP9/l7T///HPOPfdcbrzxRkaPHs3SpUu54YYbeq0CRTRVhYpD8NkT8Pyl8Jux8MY34eDb2ucXrGDbxa9xQh3OyNTYXhMV7+JlgK351Z633ra14E1s8j7JLThjIIFv7HCEPQn2t3XtP/vKsDrcjBkW16eNNgeT4e3W6QRCEp2eGfQ65o5uq6zWNtsprdeq0sHc9DWSDZ2UzQ9uSXSEEGLIsdvt7Ny5k1WrVvmu0+l0LF68mM2bN3d5zMKFC/n73//Otm3bOPvss8nPz2ft2rXcdNNNXd7eZrNhs9l8Hzc0aK+aOhwOHI7A1h14j2v/NmTcLpT8j1GOr0N3fD1K/akOn1bTJ+IetwR18pWoObPZt6kQgElZ8R1i6y7eeaO0KU2fH6/i2tnZbD6hJTxzRyYF7WsblaolBicqGjucM79SG1CQm2zxK9bBIitBSyBL6lqx2uxA17H+c6f2s7p6ZjZOp3PgAuxBX7+3OZ51P0U1zQEde6JCq1KMSrEEfJ+D/fegvf7EetbIJD45WsnmE1WMG6b9reSmxGDRh+ZrHyzfV3/vP6oSHVXvWWDnlERHCCGGiqqqKlwuF5mZmR2uz8zM5PDhw10ec+ONN1JVVcV5552Hqqo4nU6+853vdNu6tmbNGlavXt3p+nXr1hEb2/dF0uvXr+/zsb3Rue2cVfAHshr2+q5zKUaqEiZTnjiLssSZtJqHgQ3YUwp7SvnwmA7QoW8oZe3akt7jrVcAPZ8cLuHlt09xssaAgkrNke2sPRGcr6OhQruP7UdOslavjbF2uqG4Vg8onNizmcqDnY8L5fe2P1wq6BQ9Dhe8ufZDks2dY622wvZC7XuZWHOYtWu7/j0Ol0C/t7Xl2s9w95FC1ir5fh+3/6T2M644cYC11fsDC9JjsP4edKUvsboaAQx8fqyc2JZSQE+K0szatWuDHV4H4f6+trT41wYZVYmO2+gZP+mI0sWmQgghANi4cSMPPfQQTz/9NPPnz+f48ePcddddPPjgg/zyl7/sdPtVq1axcuVK38cNDQ3k5uaydOlSEhMD74V3OBysX7+eJUuWYDT2fy1L5ztoRf/6Lega9qIaYnBP/yrquCWoo88n1RRHKtB5+0145snPgSauvGBuhylf3cV7od3Fc0c+os4OtcmTgONMyUnkui8vCNqXklVUx0snttFELJdddgEAxyqaULd+TrzZwPVXLumwgD7k39sgeOzwJ5yuszJ2xllUH9neKdY/fHQCOMGCsWncePW88AV6hr5+b+OPVfFa/i4cpkQuu2yhX8c4XW5+tG0DoHL9ZYsCHiEeCb8HXv2J1eFy88cjH9HscHPMngw0smjWeC67cOygizWYvFX13kRVooNB+yPRSUVHCCGGjPT0dPR6PeXl5R2uLy8vJysrq8tjfvnLX3LTTTdx++23AzB9+nSam5v51re+xf/8z/+g03Vcwmo2mzGbO4/dNRqN/Xqw7+/xXbK3wOs3Qf5GMMai3Pgq+rwLej3M5nRx3LMOZlpuSpdxnRmv0Whkxohkdp6s5a+bTwJwzpj0oH5N47O0/UFK6q240GEx6jlVp7URjhkWh8nU9QL6kHxvg2REaiyn66yUNTkx0jFWVVV5e28pAF+Zlzsov4ZAv7ej0rX1IiV1VgwGg1+T3UoamnG4VMwGHblpCej6OEJ8MP8enKkvsRqNMHdUKp8dr+JgqdbqN31E13+/wRTu76u/9x1VwwjwVHQUp1R0hBBiqDCZTMydO5cNGzb4rnO73WzYsIEFC7quLLS0tHRKZvR6bXyvd1RyRLI3w0tf9SQ5cfD118GPJAfgeEUTTrdKosXgWzDvj3M8Y6brPHuknBPEQQQAKbFGkmK0JzWF1VoiFumL1L0jpku6GEiwvbCWopoW4kx6lk3tOlGPNN6pa402Jw2t/q03ym/3M+5rkhMtzjljz6rJ2TKIwCu6Eh2DNoxA55JERwghhpKVK1fy3HPP8X//938cOnSI7373uzQ3N3PbbbcBcPPNN3cYVrB8+XKeeeYZXnnlFQoKCli/fj2//OUvWb58uS/hiTi2Rvj7dVD4KZgS4KY3YfS5fh/u3VF9cnZiQHupzM9rS2wUBc4e3f+NQttTFKXT5DXv20hNdHqavObdO+ey6dlDZsyvxagnPV6rvJ3yc8R0pP+MB1L7KYeBvlAx1A2NvyA/6TwVHYMkOkIIMaRcf/31VFZWcu+991JWVsasWbN4//33fQMKioqKOlRwfvGLX6AoCr/4xS8oLi5m2LBhLF++nF/96lfh+hL6x9oA//gKnNoC5kT4f29C7lkBneKQp+0l0I0G545KQa9TcLlVJmUlkhQb/HaWMelx7DlV53uVP/IrOt59ZazQthSKVruL9/ZpbWvXzg393jkDaXhKLFVNdorrWpk2PKnX20f6z3ggzRiRhNmgw+Z0B/xCxVAXVYmOYtJKxXpJdIQQYshZsWIFK1as6PJzGzdu7PCxwWDgvvvu47777huAyELMWg9/vxZObwdLEtz0FgyfG/Bp+rrRYJzZwIwRSewuquvUQhMsvoqO58lv2x468SG5v1Dr0LrWLtFZd7CMJpuTESkxQa+MhduIlBj2nqrzey8dSXT8ZzbomTsqhc9PVAf8QsVQF1Wta3qz9gqK0S2JjhBCiCGgtRZevMqT5CTDzf/qU5KjqioHPYnOlD7sqP7tC8YwKSuBr88fGfCx/sgb1pboNFgdVDVpwwhGp/d9tHc4eSs6xfVW3O2WhL3uaVu7Zs6IIbcuZUSyt4rlZ+uaN5kdJomOP+64YAwTMxP46rzccIcyqERVRUfvqegY3LZebimEEEIMco5WLckp3QMxqXDLvyBrep9OVVpvpb7VgUGnMC4j8CrJJdOyuWRadp/u2x/tKzqFnifAwxLMJFgiY5rWmbKSLOgUsDvdNHr2PSyrt7LpeBUA184ZHsboQsOX3PlR0bE6XL71S3kRWrUbaBdOzODCiRm93zDKRFdFx+Sp6Kj2MEcihBBC9NORtW1Jzq3v9jnJgbZBBGOHxWMxDr5hDKPTtESnptnO7qI6ILJbmox6HdlJ2nOSWs9rr2/tLsatwlmjUxiVFrlfW3e87Xr+tK55p+slxRhJCcGaLxE9oirRMZq1PzKzKhUdIYQQEe7k59rbGddD5tR+ncq7Pmew9vfHmQ1kJWqTUz86XAFoAwoimXcyVo1NQVVV3tilta1dO2doDSHwGp7if+ta+4lrsrBe9Ed0JToW7Z+iSRIdIYQQke7kZu3tKP92mu/JQd8ggsG7/4a3grP5RHWHjyOVt5Wr2gb7ihs4XtGE2aDjshmhawEMJ29i12B10mB19HjbtmETkf0zFuEXZYmOp6KDLbI3hBNCCBHdWmqg4oD2fhASHV9FJ7v3sb/h4h1IYHe5tY8j/EmwN9GptSm8tacEgKVTs0iM0HVHvYkzG0iN0/bS6W2djkxcE8ESVYmOKUZb0GbBgcMliY4QQogIVbRFe5s+EeLS+3WqJpuTwmqtnWgwV3TOfHU/0qdxeVu5Klrh3S/KgKE5hKC94b7Ja34mOhH+MxbhF1WJjtmzRseCHavDGeZohBBCiD46uUl7G4RqzpEyrZqTmWgmLd7c7/OFSvtX93UK5KZG5mhpL+/i/OMNCnWtDjISzJw/fliYowqttslrPa/TkYqOCJaoSnS8rWs6RcVq9W+OuxBCCDHoeAcRBGN9TknfNgodaO2f9I5IicVsGHzT4QLhfdKvoi22v3r2cPRDbO+cM41I6b2iU9dip6ZZm447eghOnxMDK6oSHcXU9uqPrUUSHSGEEBHI1gSle7X3gzKIoBHo20ahAyk3NdaXCAyFV/qzk2JoP1Ds2rlDc9pae/60rnmrOVmJFuLMUbXdowiB6PoN0htxosOAG4e1KdzRCCGEEIE7vQ1UFySPhKT+Pzlum7g2uBMdo17HyNRYCqqah0SiYzLoyEgwU95gY1pOIhMyB+/6qGDxtut9cbqOP2w41uVtjpRrifdQ+BmL8IuuRAewYcKAFZu0rgkhhIhEvra1c/t9qi9O13GguB6AqYN0D532xmXEU1DVzLiM+HCHEhR5abGUN9i4enZOuEMZEKM9yUtJvZVH1x/t8bZD5Wcswiv6Eh3FTJxqxWFtDncoQgghROC8ic7IBf06TYPVwYqXduN0q1wyNYsxwwb/E8ufLJvI1JxErp49NKaT/c9lk/jzu59xw1lDv20NtOTl/uVTOFLec1dNjFHPN8/PG6CoxFAWdYmOQzGDCk6bVHSEEEJEGKcNTu/Q3u9HRUdVVVa9uY+imhZGpMTw8HUzghRgaI3PTODuIdTiNSkrgYtyVIz66Fkyfeu5ksCIgRM9f1kedkUbnemU1jUhhBCRpngXuGwQlwFpY/t8mpe2FfHeF6UYdAp/uGE2STFDc5NKIUR0i7pEx6nTEh2XXVrXhBBCRJj2++cofRtFfKi0gdX/PgjATy6ZyOyRKcGKTgghBpXoTXRsPe/KK4QQQgw6/dw/p9nm5M6XdmF3urlw4jBuP29MEIMTQojBJfoSHb02w93tkERHCCFEBHE54dQ27f0+Jjq/fGc/+ZXNZCaaefSrs9AN8Q0qhRDRLeoSHZenouO2yxodIYQQEaR8H9gbwZIEGVMCPvz1nad5c1cxOgV+/7XZpMaZQhCkEEIMHtGX6Bgs2jtS0RFCCBFJ2o+V1ukDOvR4RSO/fHs/APcsnsD8MWnBjk4IIQadqEt0VL0kOkIIISJQH9fnWB0uVry0m1aHi3PHpfG9C8eFIDghhBh8oi/RMWhrdHBKoiOEECJCqGq7ik5gic4D7x7kcFkj6fEmHr9+FnpZlyOEiBJRt2EoRi3RUZzWMAcihBBC+KnyCLTWgDEWsmcC0Gh18IOXd1Na3/3jmVtVOVrehKLA49fPIiPBMlARCyFE2EVdoqN61ujoJNERQggRKbz754w4CwzaEIEPDpTz8ZFKvw7//oXjOH/8sFBFJ4QQg1LUJTqKKRaQREcIIUQE8a3POdd31Zb8agCumT2ca+aM6PbQlDgjU3OSQhqeEEIMRlGX6Og8rWt6tyQ6QgghIkD79TmjFviu3lqgJTrLZ+Vw3vj0cEQmhBCDWtQNI1BMnkTHJYmOEEKICFB3EhpLQGeE4fMAKKlr5VRNK3qdwrxRKWEOUAghBqeoS3T0Zq11zeC2hTkSIYQQwg/eas7wOeBpv/ZWc6blJJJgMYYrMiGEGNSiL9HxPEgYpXVNCCFEJPAOImi3f86WEzUAsvGnEEL0IPoSHbM30ZGKjhBCiAjQxf453orOOWNSwxGREEJEhKhLdIzmOABMqiQ6QgghBrnGMqjJBxQYOR+AsnorhdUt6BSYN1oSHSGE6E4UJjraMAKTag9zJEIIIUQvvNWcrOlg0UZEe6s5U3ISSZT1OUII0a2oS3RMsfEAmJGKjhBCiEGuy/1ztPU55+TJ+hwhhOhJ9CU6njU6Fuw4Xe4wRyOEEEL0oIf9c2QQgRBC9Cz6Ep0YraJjwY7V4QpzNEIIIUQ3Wmqg4qD2vmcQQUWDlfzKZhQFzpb1OUII0aOoS3TMFm0YgUFxY7XJiGkhhBCD1KmtgArpEyB+GABbC7S2tclZiSTFyvocIYToSdQlOjpTjO99a0tzGCMRQgghetDF/jltbWtSzRFCiN5EXaKDwYwbBQCHTRIdIYQQg1QPgwjmyyACIYToVfQlOoqCDRMANqnoCCGEGKyqjmtvs2dqHzbZOF7RBMD8PKnoCCFEb6Iv0QFsmAFw2FrCHIkQQgjRDYfnMcqcAMA2z/qcSVkJpMSZwhWVEEJEjKhMdOyK9gDhsEpFRwghxCDkcoDbob1v1NaWbsn3rM+Rao4QQvglKhMdh06r6LikoiOEEGIwcrR7fDJq00K3ejcKlf1zhBDCL9GZ6CgWAJz21jBHIoQQQnTB4Xl8UvSgN1LTbOdIeSMAZ0tFRwgh/BJwovPJJ5+wfPlycnJyUBSFt99+u8fbb9y4EUVROl3Kysr6GnO/OfVaRcctU9eEEEIMRnbP45MxFhSFbZ6x0uMz4kmLN4cxMCGEiBwBJzrNzc3MnDmTp556KqDjjhw5Qmlpqe+SkZER6F0HjVOnVXTcUtERQggxGHkrOqZYoG2stLStCSGE/wyBHnDppZdy6aWXBnxHGRkZJCcnB3xcKLi8FR27rNERQggxCHkTHc8ggq2eiWuyUagQQvgv4ESnr2bNmoXNZmPatGncf//9nHvuud3e1mazYbPZfB83NDQA4HA4cDgcAd+39xjvW5enouOyt/TpfKF0ZqyDWSTFCpEVr8QaGpEUKwyOeCPlezXkeIcRGGOpa7FzuEx7HJT1OUII4b+QJzrZ2dk8++yzzJs3D5vNxp///GcWLVrE1q1bmTNnTpfHrFmzhtWrV3e6ft26dcTGxvY5lvXr1wOQanUCUFNWzNq1a/t8vlDyxhoJIilWiKx4JdbQiKRYIbzxtrRI5Tss2iU62wpqUFUYOyyOjARLeOMSQogIEvJEZ+LEiUycONH38cKFCzlx4gSPP/44f/vb37o8ZtWqVaxcudL3cUNDA7m5uSxdupTExMSAY3A4HKxfv54lS5ZgNBrZV/wWVEBaYgznXXZZ4F9UCJ0Z62AWSbFCZMUrsYZGJMUKgyNeb0VdDDBfohPTrm1N1ucIIUQgBqx1rb2zzz6bzz77rNvPm81mzObOU2WMRmO/Huy9xytGrSqkc9sG7ZOd/n6tAymSYoXIildiDY1IihXCG28kfZ+GFN8anVi2FshGoUII0Rdh2Udnz549ZGdnh+OuNQZtcafikKlrQgghBiHPsBy7zsKBEq2qJhPXhBAiMAFXdJqamjh+/Ljv44KCAvbs2UNqaiojR45k1apVFBcX8+KLLwLwxBNPkJeXx9SpU7Farfz5z3/mo48+Yt26dcH7KgJl1HqcdS5bLzcUQgghwsDTulZl06OqkJceR2airM8RQohABJzo7NixgwsvvND3sXctzS233MILL7xAaWkpRUVFvs/b7XZ++MMfUlxcTGxsLDNmzODDDz/scI6Bpnj2JdC7rGGLQQghhOiWp+OgtEUBpG1NCCH6IuBEZ9GiRaiq2u3nX3jhhQ4f/+QnP+EnP/lJwIGFks6kta5JoiOEEGJQcjQDcLJRe7yVtjUhhAhcWNbohJveU9ExuKV1TQghxCDkqeicatQ+lI1ChRAicFGZ6Og8iY7RLRUdIYQQg5An0WlRzYxMjSU7KSbMAQkhROSJykTHYNYeMIyqVHSEEEIMQp5hBK2YOEeqOUII0SdRmujEAZLoCCGEGKTs3kTHzPw8WZ8jhBB9EZWJjtGita6ZJdERQggxGHkrOqqZGSOSwhyMEEJEpuhMdGLiATCp9jBHIoQQQnTBs0anFRMJFmOYgxFCiMgUlYmOyaxVdCzYcLm7H5UthBBChINq18ZLt2ImxqQPczRCCBGZojLRMcdoa3Qs2LE5XWGORgghhOjI7a3oqGZijJLoCCFEX0RpouNpXVNctFplnY4QQohBxrNGx64zYzJE5UO1EEL0W1T+99Sb2vYjsFlbwhiJEEKIYHnqqacYPXo0FouF+fPns23bth5vX1dXx5133kl2djZms5kJEyawdu3aAYq2Z4pn6ppqiA1zJEIIEbkM4Q4gLAwW37v21mZgWPhiEUII0W+vvvoqK1eu5Nlnn2X+/Pk88cQTLFu2jCNHjpCRkdHp9na7nSVLlpCRkcHrr7/O8OHDOXnyJMnJyQMf/JlUFcWpta6pRkl0hBCir6Iz0dHpsGLS1ui0NoU7GiGEEP302GOPcccdd3DbbbcB8Oyzz/Lee+/x/PPP87Of/azT7Z9//nlqamr4/PPPMRq1qWajR48eyJC753KgqNr6UaVdB4IQQojARGXrGoAdEwBOm7SuCSFEJLPb7ezcuZPFixf7rtPpdCxevJjNmzd3ecy//vUvFixYwJ133klmZibTpk3joYcewuUaBANqHG2PS4pUdIQQos+is6ID2BQzqE3YZY2OEEJEtKqqKlwuF5mZmR2uz8zM5PDhw10ek5+fz0cffcTXv/511q5dy/Hjx/ne976Hw+Hgvvvu63R7m82GzdY2vKahoQEAh8OBw+EIOGbvMV0e29KAEXCoekwmU5/OH2w9xjvISKyhE0nxSqyhMVhi9ff+ozbRcShmUMFpbQ53KEIIIQaY2+0mIyODP/3pT+j1eubOnUtxcTGPPPJIl4nOmjVrWL16dafr161bR2xs36su69ev73RdnLWMxWh76DQ31A6aAQnQdbyDlcQaOpEUr8QaGuGOtaXFv0JF9CY6OjO4wWWXio4QQkSy9PR09Ho95eXlHa4vLy8nKyury2Oys7MxGo3o9W171EyePJmysjLsdjsmk6nD7VetWsXKlSt9Hzc0NJCbm8vSpUtJTEwMOGaHw8H69etZsmSJb41QW+D74RC0YiI3O5PLLpsd8PmDrcd4BxmJNXQiKV6JNTQGS6zeqnpvojvRAVyyRkcIISKayWRi7ty5bNiwgauuugrQKjYbNmxgxYoVXR5z7rnn8tJLL+F2u9HptOWqR48eJTs7u1OSA2A2mzGbzZ2uNxqN/Xqw7/J4tx3QNguNNffv/MHW3693IEmsoRNJ8UqsoRHuWP2976gdRuDyJDre3aeFEEJErpUrV/Lcc8/xf//3fxw6dIjvfve7NDc3+6aw3Xzzzaxatcp3++9+97vU1NRw1113cfToUd577z0eeugh7rzzznB9CW08wwhaMRNr1PdyYyGEEN2J2oqOU6+N7HTbJNERQohId/3111NZWcm9995LWVkZs2bN4v333/cNKCgqKvJVbgByc3P54IMPuOeee5gxYwbDhw/nrrvu4qc//Wm4voQ2nhfgWjERY5JERwgh+ipqEx23XqvoqA5pXRNCiKFgxYoV3baqbdy4sdN1CxYsYMuWLSGOqg+8FR3VLImOEEL0Q9S2rrkNnk3YnFLREUIIMYh4Ep0WzMRI65oQQvRZFCc6Fu0duyQ6QgghBhFP65oVE7FS0RFCiD6L2kQHb6LjsoY3DiGEEKI9u7a/W6tqxiIVHSGE6LMoTnS01jWdQxIdIYQQg0i7YQRS0RFCiL6L3kTH6El0XNK6JoQQYhDxjZe2SKIjhBD9ELWJjmKKBUDnsoU5EiGEEKIdb0VHNUnrmhBC9EP0Jjqeio5eKjpCCCEGE19Fx0SsKWp3gRBCiH6L2kRHb9ISHYNbKjpCCCEGEd94aYuMlxZCiH6I3kTHHAdIoiOEEGKQaTdeWjYMFUKIvoveRMdT0TG5ZeqaEEKIQcTuaV1TzZLoCCFEP0RtomOwaBUdo2oPcyRCCCFEG7X9Gh1pXRNCiD6L2kTHaNamrplUqegIIYQYPNzeig5S0RFCiP6I3kTHoiU6ZqnoCCGEGEzszQBYMWM2RO3DtBBC9FvU/gc1WeIBMGNHVdUwRyOEEEJ4eIYRuA0xKIoS5mCEECJyRW+iE6NVdGKwY3O6wxyNEEII4eH07O9mjA1vHEIIEeGiNtExx3gqOoqDVpsjzNEIIYQQgKqi8yY6numgQggh+iZqEx3vMAIAm7UpjJEIIYQQHk4biqp1GShS0RFCiH6J2kQHY9srZbbWljAGIoQQQng42h6PFFNcGAMRQojIF72Jjk6PHQMgiY4QQohBwjOIwKYaMJuMYQ5GCCEiW/QmOoANEwAOm7SuCSGEGAQ8FR0rJmJNhjAHI4QQkS2qEx27YgHAIRUdIYQQg4Gj3WahRtksVAgh+iPKEx2touP0bM4mhBBChJWnda1FNRNjkkRHCCH6I6oTHYfODIDL1hrmSIQQQgjA88KbVSo6QgjRb1Ge6Gita06btK4JIYQYBDwVnVZMxEpFRwgh+iWqEx2np6LjtkuiI4QQYhCQ1jUhhAiaqE50XHqtoiOJjhBCiEHBN3VNWteEEKK/ojzR0So6qkPW6AghhBgEfFPXpHVNCCH6K6oTHdVT0VHtkugIIYQYBDyJTotqxiIVHSGE6JeoTnTchhjtHYc1vIEIIYQQ0G4YgVk2DBVCiH6K6kRH9SQ6ikvW6AghhBgE7N41OiZiTFH9EC2EEP0W1f9FfYmOwxbmSIQQQgja1uioZmKMUtERQoj+iOpERzFqa3R0LlmjI4QQYhDwjpdGxksLIUR/RXmio1V0dE5ZoyOEEGIQcDQDWuuaTF0TQoj+ie5ExxQLgN4tiY4QQohBwDuMQJV9dIQQor+iOtHRmbSKjsEla3SEEEKEn+oZRiCta0II0X9RnejoPRUdg1R0hBBCDAKqb7y0tK4JIUR/RXeiY9YSHaNbKjpCCCHCz23zrtExYzFIoiOEEP0R1YmO0ZvoqJLoCCGEGAQ846Vdegs6nRLmYIQQIrJFdaJjsMQBYFLtYY5ECCGEwDeMwG2IDXMgQggR+aI60TF5KjpmqegIIYQYBBSnVtFRjJLoCCFEf0V1omOM0So6ZmyoqhrmaIQQQkQ1VUXv9Gxg7dnnTQghRN9Fd6LjaV2LwY7d5Q5zNEIIIaJau82rFXNcGAMRQoihIaoTHYunohOj2LHaXGGORgghRFTz7KEDoJOKjhBC9FtUJzpGS1sPtNXW0sMthRBCiBDzTFyzqUYsZlOYgxFCiMgX1YlO+8We9tamMEYihBAi6nkmrrVgJsYoe+gIIUR/RXWig96IE+3BxNbaHOZghBBCRDVPRacVE7EmSXSEEKK/ojvRAWxo7QF2q7SuCSGECCNvoqOaiZFERwgh+i3qEx27oiU6DqtUdIQQQoSRJ9GxYpLWNSGECIKAE51PPvmE5cuXk5OTg6IovP32270es3HjRubMmYPZbGbcuHG88MILfQg1NGyKBQCnDCMQQggRTu3W6EjrmhBC9F/AiU5zczMzZ87kqaee8uv2BQUFXH755Vx44YXs2bOHu+++m9tvv50PPvgg4GBDweGp6DiloiOEECKc7G2taxZJdIQQot8MgR5w6aWXcumll/p9+2effZa8vDweffRRACZPnsxnn33G448/zrJlywK9+6Bz6szgApfnlTQhhBAiLNq1rsVK65oQQvRbwIlOoDZv3szixYs7XLds2TLuvvvubo+x2WzYbDbfxw0NDQA4HA4cDkfAMXiP6epYh87Tutba1KdzB1tPsQ42kRQrRFa8EmtoRFKsMDjijZTv1ZDQfry0VHSEEKLfQp7olJWVkZmZ2eG6zMxMGhoaaG1tJSam8+7Pa9asYfXq1Z2uX7duHbGxsZ2u99f69es7XTfK8xh+qvA4tWvX9vncwdZVrINVJMUKkRWvxBoakRQrhDfelhZZvzhgHFoLdatqJs4U8odnIYQY8gblf9JVq1axcuVK38cNDQ3k5uaydOlSEhMTAz6fw+Fg/fr1LFmyBKPR2OFzh4/9EZogZ1gq5112Wb9j76+eYh1sIilWiKx4JdbQiKRYYXDE662oiwHgqehYMZEurWtCCNFvIU90srKyKC8v73BdeXk5iYmJXVZzAMxmM2azudP1RqOxXw/2XR2vGjwxOK2D6olPf7/WgRRJsUJkxSuxhkYkxQrhjTeSvk8RT6auCSFEUIV8H50FCxawYcOGDtetX7+eBQsWhPqu/aIaPAmV0xreQIQQQkQ32TBUCCGCKuBEp6mpiT179rBnzx5AGx+9Z88eioqKAK3t7Oabb/bd/jvf+Q75+fn85Cc/4fDhwzz99NO89tpr3HPPPcH5CvrJbdDW/CgO6UMXQggRRt7x0rJhqBBCBEXAic6OHTuYPXs2s2fPBmDlypXMnj2be++9F4DS0lJf0gOQl5fHe++9x/r165k5cyaPPvoof/7znwfFaGkADNrUNUUqOkIIIcLJN15aWteEECIYAl6js2jRIlRV7fbzL7zwQpfH7N69O9C7GhCqUVujo7hsvdxSCCGECB3V0YoCtKhmqegIIUQQhHyNzmCn8yQ6eqdsGCqEECJ8VLtnvLTsoyOEEEER9YmOYvIkOi5pXRNCCBE+bru3dU3W6AghRDBEfaKjM2nDCAxuSXSEEEKEj2rXOgvsuhgM+qh/eBZCiH6L+v+kek+io3fLGh0hhBBh5NBa19yeITlCCCH6J+oTHZ1ZS3SMkugIIYQII8WzYSjG2PAGIoQQQ0TUJzpGzxodSXSEECKyPfXUU4wePRqLxcL8+fPZtm2bX8e98sorKIrCVVddFdoAe6E4JdERQohgivpEx2CJA8CkSqIjhBCR6tVXX2XlypXcd9997Nq1i5kzZ7Js2TIqKip6PK6wsJAf/ehHnH/++QMUaTfc7rahOJLoCCFEUEii40l0zJLoCCFExHrssce44447uO2225gyZQrPPvsssbGxPP/8890e43K5+PrXv87q1asZM2bMAEbbhXZbHOjNkugIIUQwBLxh6FBjtmgPKGbsYY5ECCFEX9jtdnbu3MmqVat81+l0OhYvXszmzZu7Pe6BBx4gIyODb37zm3z66ac93ofNZsNma3tBrKGhAQCHw4HD4Qg4Zu8xvmNbGjB6PqcYLH06Zyh1incQk1hDJ5LilVhDY7DE6u/9R32iY/JWdLDjcLkxykhPIYSIKFVVVbhcLjIzMztcn5mZyeHDh7s85rPPPuMvf/kLe/bs8es+1qxZw+rVqztdv27dOmJj+16BWb9+PQAx9iqWAq2qifraatauXdvnc4aSN95IILGGTiTFK7GGRrhjbWlp8et2kujEaIlODDaa7U6MMaYwRySEECKUGhsbuemmm3juuedIT0/365hVq1axcuVK38cNDQ3k5uaydOlSEhMTA47B4XCwfv16lixZgtFohMojcABaMTE6N4fLLpsR8DlDqVO8g5jEGjqRFK/EGhqDJVZvVb03UZ/omD0VHb2iYrVZSZRERwghIkp6ejp6vZ7y8vIO15eXl5OVldXp9idOnKCwsJDly5f7rnO73QAYDAaOHDnC2LFjOxxjNpsxm82dzmU0Gvv1YO87XtXap1sxE2/p3zlDqb9f70CSWEMnkuKVWEMj3LH6e99R36elmNpaDmwtzWGMRAghRF+YTCbmzp3Lhg0bfNe53W42bNjAggULOt1+0qRJ7Nu3jz179vguX/7yl7nwwgvZs2cPubm5Axm+xrOHTqtqxmLUD/z9CyHEEBT1FR30Jtwo6FCxWyXREUKISLRy5UpuueUW5s2bx9lnn80TTzxBc3Mzt912GwA333wzw4cPZ82aNVgsFqZNm9bh+OTkZIBO1w8Yh9Zv3oqJWJMkOkIIEQyS6CgKVszEYsVh9W9hkxBCiMHl+uuvp7KyknvvvZeysjJmzZrF+++/7xtQUFRUhE43iJsYfImOmRip6AghRFBIogPYMRGLFXtrU7hDEUII0UcrVqxgxYoVXX5u48aNPR77wgsvBD+gQHha16yqiRiTPDQLIUQwDOKXtwaOXdEWmDrtrb3cUgghhAgBT0WnBYtUdIQQIkgk0QHsOi3RccgaHSGEEOFglzU6QggRbJLoAE5PouO2yxodIYQQYeCbumYiRhIdIYQICkl0AIfOAoBLWteEEEKEg28YgbSuCSFEsEiiA7g8FR2ntK4JIYQIBxkvLYQQQSeJDmAwa5uGVtc1hDkSIYQQUcmb6MiGoUIIETSS6AAx8YkAtNaWhDkSIYQQUcm7RgezVHSEECJIJNEBzGPPB2B68+c4Xe4wRyOEECLqtJu6JsMIhBAiOCTRAVLnXotLVZipnKAo/3C4wxFCCBFl3O1a12KNsmGoEEIEgyQ6gC4xk4OmGQC07H49zNEIIYSINu52FR2LSR6ahRAiGOS/qUdh1hIAUgvXhjkSIYQQ0Ub1JDo2xYJJLw/NQggRDPLf1MM9cTkuVSGn5RDUFoY7HCGEEFFEtWvbG6iGGBRFCXM0QggxNEii4zE2L48t7ikAqAfeDm8wQgghoorimbrmNsaEORIhhBg6JNHxGJ8Zz3/UcwBwfPFGmKMRQggRTRSnluhgjA1vIEIIMYRIouNhNug5nnYRLlXBVPEF1BSEOyQhhBBRQueZuoZUdIQQImgk0Wln+PBcNnva1zj4dlhjEUIIESXcLnRuOwCKSSo6QggRLJLotDM1J5H33Fr7GgfeCuhYh8vNUx8f52BJQwgiE0IIMWR51ucAKKa4MAYihBBDiyQ67UzNSeQD11k40UHpXqjJ9/vYt3YX88gHR7jjxR3YnK4QRimEEGJI8batAUaTtK4JIUSwSKLTzuScRGpI5HPXVO2KAKavfXqsCoDiulZe3loUgugGltutsvNkLS12Z7hDEUKIoc2T6LSoZiwmQ5iDEUKIoUMSnXYSLUZGpsay1j1fu8LP9jW3W+Xz41W+j5/8+HjEJwjrDpZx7TOf89DaQ+EORQghhjZP61orJmJN+jAHI4QQQ4ckOmfQ2tfm4Vb0UPYFVJ/o9Zgj5Y1UN9uJNekZmRpLVZOdv24qDH2wIeRda7T3VH2YIxFCiCHOU9FpxUyMURIdIYQIFkl0zjAlO5FaEjkaO0e7wo+qziZPNefsvFRWLpkAwB//e4L6VkfI4gy14jorAIVVzaiqGuZohBBiCLN7Eh3VTIy0rgkhRNBIonOGqcMTAdra1/wYM/2ZJ9E5b1w6y2fmMDEzgQark+c+8X+YwWBTUqe1UjTanFQ12cMcjRBCDGHSuiaEECEhic4ZpuYkAfCP+hmoih7K9kHV8W5vb3e62VZQA8C549LR6xR+uFSr6jy/qYDKRlvogw6B0vq2caeF1c1hjEQIIYY4aV0TQoiQkETnDBkJZtLiTFS742nMOU+78mD37Wt7TtXRYneRFmdiYmYCAEumZDIzN5kWu4unN3afJA1WqqpSUm/1fVxQJYmOEEKEjKN965okOkIIESyS6JxBURSm5GjtawdTLtauPPBOt7f3rs9ZOC4dnU7xneMnyyYC8I8tRRTXtXZ7/GBU3WzH7nT7Pi6UREcIIULHV9ExSUVHCCGCSBKdLngTnQ/VeaAzQPk+qDrW5W29ic65Y9M6XH/uuHQWjk3D7nLz+w+7PnawKjkjMZPWNSGECCHfGh2zrNERQoggkkSnC951OjsqgDGLtCu72Dy0yeZkz6k6QEtszvQjT1Xn9V2nOVHZFIJIQ+PMRKegqqWbWwohhOi3dlPXLJLoCCFE0Eii04WpnorO4bIG3FOu0q7sYsz0toJqnG6Vkamx5KbGdvr8nJEpLJ6cicut8vj6o6EMOahKPKOlJ2dr3wcZMS2EECHUrnUtVlrXhBAiaCTR6cLotDhijHqsDjeF6YtAZ4SKA1DZMVnZdLwa6Lqa4/XDpRNQFHj3i1IOlETG5pveis78vFT0OoVWh4vyhsicHieEEINeu9Y1GUYghBDBI4lOF/Q6hcnZ2gS1fTW6tva1M/bU8a3PGddxfU57k7MT+fLMHAAeXRcZVZ1Sz8S1kamxjEiJAWTymhBChEy7qWuyRkcIIYJHEp1ueNfpHCxpgKlXa1fuf9P3+cpGG4fLGgFYOLb7ig7APYsnoNcpfHS4gh2FNaEJOIi8U+JykmMYnRYHyEACIYQImXataxZpXRNCiKCRRKcb3slrB0oaYNJloDdB5SHY9zoAn5/QqjlTcxJJjTP1eK7R6XF8dd4IAH7zwZFBv96lxJfoWMhL9yQ6UtERQoiQUO1tG4bGmgxhjkYIIYYOSXS6MdWX6NSjWpLhvHu0T7z3Q2gobde21nM1x+v7F43HZNCxraCGzfnVoQg5KOxON5VN2nqcnOQYX6IjrWtCCBEaLk+i0yKta0IIEVSS6HRjQmYCep1CbYuDsgYrXPBjyJ4F1jrUf61g07HAEp2c5BiumJENwOfHB2+iU95gRVXBZNCRFmditCQ6QggRUqpN+/9qVUyYDfKwLIQQwSL/UbthMeoZNywegAPFDaA3wjV/Ar0Z5fiHLGp6F6Ne4azRKX6fc3Zusna+QTx9zbc+J8mCoijkedbonKxpwe0e3C13QggRiVTP1DW3PgZFUcIcjRBCDB2S6PRgavt1OgDDJsLi+wH4H8M/uDSnNaB+6imeAQf7vecLIZvT1afjSuvbBhFoby0Y9Qp2p5uS+taeDhVCCNEXnmEEqiEmzIEIIcTQIolOD7wDCQ6WtqvAzP8OR2JmEavYWGV9Atz+JxSTsxNQFG1iW0WjNcjRaqwOF9/+2w6m37+O/cWBV468m4VmJ2kPuAa9zrcZamFVS/ACFUIIofEkOm5j542nhRBC9J0kOj2YcmZFB3CjcJf1WzSoMWQ3fgGbfuf3+WJNBsZ62+FCUNVptDq4+fltfHCgHLvTzWeegQmB8E5cG55s8V03xrtOR0ZMCyFE0Omcnmq5VHSEECKoJNHpwdRsrdXsdG0r9a0OAA6WNnC4NZlfc5t2o48fgtIv/D+nN3nqQ7WlJzXNdm58bivbCtr26cmvbAr4PCV1HVvXgLa9dGQggRBCBJ030dGZpKIjhBDBJIlOD5JijYxI0Z7wH/RUYLxVkoq8q2HSFeB2wFvfBqfNr3N2WvcTBGX1Vr76x83sK64nNc7Et780BoD8ysATE1/rWvtER/bSEUKI0HA70bm1F9JUU1yYgxFCiKFFEp1eTMlu208H8O2fs3DcMFj+O4gbBhUH4eNf+XW+aZ6BBMFKdAqrmrnu2c85XtFEdpKF1769gOUzcgDI70Ni4h040L51TfbSEUKIEHG0DXnRm6WiI4QQwSSJTi+mehKTg6UN2JwuthdqrWHnjU+HuHQt2QHY9Hs4ubnX83nX/RTVtPja4frqUGkD1z27mdO1reSlx/HP7yxgXEY8Y4ZpiUlNs53aZrvf52u0Omi0OoG2YQTQVtEpqmnB6XL3K2YhhBDteAcRqAomk6zREUKIYJJEpxfeVrODJQ3sOlmH1eFmWIKZ8RnaUAEmXQ6z/h+gai1stsYez5cca2J4csd2uL7YVVTL9X/cTFWTjcnZibz27QWMSNFeDYw1GchO0ioy+VX+r9Mprdfa1pJijMSZ28ZmZydaMBt0ON2qb58dIYQQQeCp6LRgxhLAdgVCCCF6J4lOL7wVmGMVTXx8pAKAc8emddzU7ZI1kDQS6k7Ci1fB8Q9B7X5zzWnDO7bDBeqzY1X8vz9vpcHqZM7IZF654xyGJZg73MZb1TkRwDqd4i4GEQDodAqj0rQkStrXhBAiiDwVnVZMxJr0YQ5GCCGGFkl0epGdZCEl1ojLrfLKtiIAzh2X3vFGlkS45o9gsEDxDvj7tfCnL8GBt7vcZ2dqP9bpHCxp4BsvbKfF7uL88en8/fb5JMUaO93OO8Y6kIEEvolrSZZOn8uTgQRCCBF0iqeiY1XNxEiiI4QQQSWJTi8URfElJg2e9SudEh2AUQvh+7vgnO+BMRZK98I/b4Gn5sPuv4Ozba1M2+S1wCs67+wtxu5ys3BsGn++ZR6x3bQ6ePe+CWTEdKln4tqZFR1oN3mtOjI3DbU73azdV4bN//1dhRAi9NpVdGKMkugIIUQwSaLjB2/7GmgJRFeJAABJw7U2trv3w5d+CpYkqD4G79wJv58NW/8I9hamDdcSp+MVTbTaA3vm/fnxagC+Mm8EZkP3D4pjvBWdACowXe2h45Xn2UunL5PcBoN/bD3JXa99wUvH5VdeCDGIeBKdFqSiI4QQwSbP+vwwtV2is3BcWu8HxKXBhT+Hew7AkgcgPhMaTsN/fgJPTCej+EPS4024VThc5n/7Wl2Lnf2eKtC5Y7uoKrXjXaNzsrrZ70lpbWt0OreuRfpeOntO1Wlva3QcLe95YIQQQgwYb+saZlmjI4QQQSaJjh/aJzrnddW21h1zApx7F9z1BVz+GCSPgpYqlFe/zuqY19DjCmidzuYT1agqjM+IJyOxczLSXk5SDBajDodL5VStf5PSvFPXuqzoeBKd07Ut2J2RN2L6SFlbcvP0xoIwRiKEEO14Ep1W1YRFWteEECKoJNHxQ156PMOTY0iKMbJgTACJjpfRAmd9E1bsgHPuBODyxtd4yfQrik7m+32azzyblXa5RugMOp3C6DT/1+m43Sql9d23rmUkaK82ulU4VRtZ63ScLneHoQxrD5RxvEKqOkKI8FPata5JRUcIIYJLEh0/6HUKb31vIWvvOr/LCWd+M5jgkofgqy/iMMQxX3eY7x6+FQo+8evwz09o63P8SXQAxmb4P3mtqtmGw6WiUyDzjFHVoA1l8CZOkda+Vljdgt3lJtakZ1qKG1WFpz4+Ee6whBDCt0bHilmGEQghRJD1KdF56qmnGD16NBaLhfnz57Nt27Zub/vCCy+gKEqHi8XSc9vVYJSRaPFt9NlvU66k4mvvc8idS4pah/rilfDJb8HdfUtYcV0rBVXN6HUK88ek+nU3Y72T1/zYNLTEM3EtM9GCQd/1r4W3fS3S9tI55lmTM25YHJeM0L7H7+wpjrivQwgxBLVrXZNhBEIIEVwBJzqvvvoqK1eu5L777mPXrl3MnDmTZcuWUVFR0e0xiYmJlJaW+i4nT57sV9BDQfaY6dysPMQ/nRegqG746EF4+WvQWtvl7Td52tZmjEgi0eJfVck7ee1ERe9P6L0T17K72EPHa3R6ZG4aesST6IzPjCc3Hi6cmI5bhac+Ph7myIQQUc/pSXQwd7tdgBBCiL4JONF57LHHuOOOO7jtttuYMmUKzz77LLGxsTz//PPdHqMoCllZWb5LZmZmv4IeCnQ6hbycYfzY+R12zHxQ22z02AcY/nIRw2s2oxx8G/a8BDueh81PE7P1d9xjeJ2fG16C938O+f/t9T68k9f8q+h0vz7Hy9e6Vh1Zic6xcu3rH+9p5btz0VgA3tpdTFGE7gskhBgi7O3GS0vrmhBCBFVALx/Z7XZ27tzJqlWrfNfpdDoWL17M5s2buz2uqamJUaNG4Xa7mTNnDg899BBTp07te9RDxLScJLYV1PCe4WLmfXMRvHYzSm0B8+qfgTOKXstB+2mVeC5bnoIJl8LS/4X0cV2e39tqVtVkp77VQVJM95Ugb+taT+15eb4R05GVHHgrOhMy4mmsh5kjkvjShGH892glT288zq+vnRHmCIUQ0UrxjpdWZRiBEEIEW0CJTlVVFS6Xq1NFJjMzk8OHD3d5zMSJE3n++eeZMWMG9fX1/Pa3v2XhwoUcOHCAESNGdHmMzWbDZrP5Pm5o0EYwOxwOHA5HICH7jmv/drCYlKklDvtO1+G45Gz4xofw4X00HfucxNQMFFMsGMw0Og18cLQBp87EdfPHYrDVo+x7DeXof1CPr8c975u4z/sxxCR3OL9Frw0WKG+0cbS0jlm5yZ2D8Ciu1ao0GQmmbr9PI5JMAJTUt9LUYkWHtt5lsH1f27M53b7hCaNTzexDi/fOL+Xx36OVvL7zNN+5YHTw1l8FyWD9ne2KxBo6gyHeSPleRSrVM4ygFRkvLYQQwRbyhuAFCxawYMEC38cLFy5k8uTJ/PGPf+TBBx/s8pg1a9awevXqTtevW7eO2NjYPseyfv36Ph8bCloHmIF9p2t597216BRAtxQmLu1wu42lCm859UxKchPndIMe4ifNYGrxK2Q17EW/7Y+4dv6dw9lXU5h+EarS9mNNVHSUo+PtjzZTMkxtO6nqGXygaN2Lh07qAYXS4wdYW7O/y3hVFWL0elpdCn9/5wOyPT+KwfZ9ba+kGZxuAzF6lS+2fIqitMU7IUnH0Xod//P3//LVMYNzb6DB/L09k8QaOuGMt6Ulsiq4kcZtb0aPjJcWQohQCCjRSU9PR6/XU15e3uH68vJysrKy/DqH0Whk9uzZHD/e/ULwVatWsXLlSt/HDQ0N5ObmsnTpUhITE7s9rjsOh4P169ezZMkSjMZ+jIcOMqfLzRMHP8LmdDP9nEWMSovtMta3/74LqGL5/Ilcdn5euzPcgTP/Y/Qf/hJT5WFmnP4701u34rp4Neq4JaAo7LDvxrBrB2ebnVwR34BSfQyl6hjUnABFh5o2HoZNpEg1sleXxTXzLmf8hKmg6/oB9y+ntrCvuIGRU+axaHzKoPy+tvfuF6XwxT4mD09h6dLZHeIdNqWWG/+ynW1VetbctKjHQQwDbbD+znZFYg2dwRCvt6IuQsNtb2tdk4qOEEIEV0CJjslkYu7cuWzYsIGrrroKALfbzYYNG1ixYoVf53C5XOzbt4/LLrus29uYzWbM5s57uRiNxn492Pf3+GAzGmFSVgJ7T9dzuKKZcVlJ7T6nxepwudleWAfAlyZmdo5/4lIYdxHs+j/4+Fco1ccwvHYjZE0HawMP1BWhmFU4gXY5g1K2F8r28n0AE/DGo6A3Q/oEGDYRRsyDUQshcxro9OSlx7OvuIFTdVZfLIPt+9reiSrtScTErMRO8S4cn8E5Y1LZkl/DXzadZPWV08IZapcG8/f2TBJr6IQz3kj6PkUi1TOMwKm3oNcpYY5GCCGGloBb11auXMktt9zCvHnzOPvss3niiSdobm7mtttuA+Dmm29m+PDhrFmzBoAHHniAc845h3HjxlFXV8cjjzzCyZMnuf3224P7lUSoKTlJ7D1dz4GSBq6YkdPp81+crqPJ5iQ51siU7G6qWXoDnPVNmH6dth/P1mehbB8AClCnxlFsyGXqjHmQPlFLYtLHa+1rlYepPbmP/276lAm6EiYby1CcVijfp132v67dhzkJRs7nK/YJnFbSKarIAkaG5psSREe9gwgy47v8/A8uHs+W/K28vP0U37twHJmJg6eqIwYnVVX56HAF04cnkSG/L6K/PGt0XIbBtU5QCCGGgoATneuvv57KykruvfdeysrKmDVrFu+//75vQEFRURE6XdvU6traWu644w7KyspISUlh7ty5fP7550yZMiV4X0UEmzZcS14OlHTdHrLpeDUAC8emoevt1T5LEix9UEt6irZAUi6nDbmc9+QXmFx6Di2/pPMrhunjOWRawN0bZzImPY6PVp4PdSeh8giU74eirdq5bPVwbB3ns47zzWA7YEbffDaTW5PRbSmA2BSwJII5UYvDnOj5OAGMsaCE55XKYxXaaOmJmQldfn7BmDTmjUphx8la/vjffO5dPjR/L91ulfJGKwVVzRRWtXCyupmCqmZO17Zy1ewcvnXB2HCHGDH+/GkBv1p7iEUTh/HCbWeHOxwR6TyJjiqJjhBCBF2fhhGsWLGi21a1jRs3dvj48ccf5/HHH+/L3USFqTlau9qB4npUVe30+c88G4UuHJvu/0lTRmsXINutYjIcwO50U1zbysi0zsMcSj2jpXOSY7S1OaljtMvES7UbuJxa0nPyc+oOb8RduIlUpQkKP2UCQPm/e47HnKS1wQ2bAMMmaVWlYRMgaSToAt7KyW9Wh8u358/4bhIdRVH4wcXjufn5bfxj60m+u2gswxI6t01Goo8Ol/Pa9tMUVjdTWN2M1dH1wIWCqmZuXjBa1gf44VRNC4+tPwrA5hPV2J1uTIbQ/Q6LoU9xav9/VaMkOkIIEWyyDXOYTcpKQK9TqG62U95gIy227clmi93J7qJaAM4bF0Ci045ep5CXFseR8kZOVDV1mei0bRbaTRuO3gA5s7TLzNuZ+8AHjFVK+PcVKmW71zEqKwWdvQmsDWBr8LytB1uj1h5nq4fT27RLe8ZYSBuntdLFpoEprotLvPY2PlO7bQCVoeMVTagqpMaZSI834XQ6u7zd+ePTmZWbzJ5Tdfz503xWXTbZ7/voi48PV7D3dB0/uGh871W6PlJVlR/98wtqmu2+6/Q6hdyUGEanxzE6LY7RabE8vfEEFY02tuRXs2hiRkhiGSpUVeUXb++n1eECtNHl+0vqmTMyJcyRiUimc2r/fxVT3yeKCiGE6JokOmFmMeoZNyyeI+WNHCip54Jxqb7PbS+sxeFSGZ4cw6guEhR/jRmmJTr5lc1cOLHz50vqtVcUs5N6f0UxOdZEcqyZ4y0jOJa7gIKqbEZcdhm6rhYsq6qW7NQVQdURqDwKlYeh6ihUHdNaNsq+0C7+SBsP066BqddAxqReb+5dnzM+Ix6lhwRJURTuung8t72wnRc3n+Sb5+WFdO3Fz9/aR2m9lZkjkrlwUmiSi+K6Vmqa7Rh0Cn+6eS556fGMSInBqO9YfThS3sjL207x8eEKSXR68a+9Jfz3aCUmvY4JWfHsL25ge0GNJDqDyFNPPcUjjzxCWVkZM2fO5A9/+ANnn911e+Fzzz3Hiy++yP792jj9uXPn8tBDD3V7+1DRexMdY9yA3q8QQkQDSXQGgak5iRwpb2R/cUOHRGeTp23t3HFpPT5R782YYdoD6InKpi4/763o+Ltp5uj0OGqL6nxtYd1SFG2dTtY07dKeywm1hVoCVH1cqwLZm8HepCVA9ua2j+3NUHsSqo/Bfx/WLhlTtIRn2jWQ1vX6kqPlnvU5WV20rbnd4GwFRyvYm1mU0sx1WeXsKndx1yt7+Pvt80MyAam+xUGpJ7HcUlAdskTHu+ZrfGYCF03K7PZ2F07M4OVtp/joSAX3q2q/fs+GsroWOw/8+yAAKy4aR6xJryU6hTV8+0uyvmkwePXVV1m5ciXPPvss8+fP54knnmDZsmUcOXKEjIzOf2cbN27khhtuYOHChVgsFh5++GGWLl3KgQMHGD58+IDErKhOdKpWaVbMUtERQohgk0RnEJiSk8ibu4s5UFLf4fq2RKdvbWteY9K1iWP5vSQ6OX4mOnlpcewuqqOwuoVRfQ1Kb4D0cdTFjuSt6ilcODOD0ek9vKJpbYAj/4EDb8LxDVBxULt8/L+QNUNLeNInQGut7zL/4BGmGauYWwT8sRVDSy2XNNdi2O/yLQD2UoDfAphh86kpvP36d7j2KzcHfYjC0YpG3/vbCmqCeu72DhRrv0vTcnred+rccemY9DpO1bRyorKJcRldr2WKdmvWHqa62c74jHi+86WxHCzVEsnthbW43WrIWhCF/x577DHuuOMO3wTQZ599lvfee4/nn3+en/3sZ51u/49//KPDx3/+859544032LBhAzfffPOAxKx3t7WWGqR1TQghgk4SnUFg2nDPQIJ2k9dqmu2+jwMaRNAFb0Unv7JzBUZVVV+ik93dGp0zeBOSwuoWRvWjw2vnyRq+/9JuSuqtPPLBEf73qmlcM2dE1ze2JMLM67VLay0celdLevL/223724UAekAbXIcCdDlmwGDR1guZ4nA3lLJAfxAO/oCm3z9L/MU/hilXdruBaqCOlLUlOvtO19NidxJrCv6f4X7P787UXhKdOLOB+WNS+fRYFR8drpBEpwubT1Tz6o5TAKy5Zjomg46pOYnEGPXUtzo4XtnEhG6GXYiBYbfb2blzJ6tWrfJdp9PpWLx4MZs3b/brHC0tLTgcDlJTU7v8vM1mw2az+T72bqTqcDhwOBwBx+xwODC4tfM5VR16g6lP5xko3tgGc4xeEmvoRFK8EmtoDJZY/b1/SXQGgSmeJ6PFda3Utmiv8G31vNo/MTOh31PAxgzTKjoVjTYarQ4SLG3raRqsTprt2uLqHD/W6EBbonOyugX60OHhdqv88ZN8frvuCC63isWoo8XuYuVre/n8RDUPXDm15yf/MSkw5ybt0lwFh/4FB/+lrQeKSYGYFBymJJ7aWk2dGs+PrzqHuKRhOI3xfLJ1N+dftBRjbJKW3BhjOiQxuvrTfPa31cypfIf42oPw+m3aBLqFP4CZN4Cxf2t3jpW3JTpOt8ruorp+V+y64q0OepPonlw0KcOX6MiY6Y6sDhf/85a2J9WN80cyb7T2JNio1zFnVDKbjlezraBGEp0wq6qqwuVy+bY58MrMzOTw4cN+neOnP/0pOTk5LF68uMvPr1mzhtWrV3e6ft26dcTG9q0aE+ep6LRiprK8hLVrT/fpPANp/fr14Q7BbxJr6ERSvBJraIQ71paWlt5vhCQ6g0KixciotFhOVrdwqFR7IrzphJboBONJcFKMkfR4M1VNNgqqmpkxItn3udJ6rZqTGmcixuRf1SIvra2iE2iiU91kY+Vre/nv0UoAvjwzhwevmsYLmwr53YajvL7zNHtO1fHkjbOZlNVzNQKAuHSY9w3t0s6BU3U8sWkTwxLM3H+W9sRFdTho/KJSG73d3W7vSSOY9+1nueXJqzin6g1uN60joSYf3r0bNq6Bc74HEy/TEh6DBQxm7a3e1LHNze0Gax20VGvJWEsVNFcx+fhu7jWUo+qMfOycxo4To4Ke6FQ0WilvsKEoMLm7TWbbuWhSBqv/fZAdhbU0WB0kWrr53oTQ3lN1POeZeOfvWrGB8PTHx8mvamZYgpmfXtJxAMa8UalsOl7N9sIa/t85fW7iFIPAr3/9a1555RU2btyIxdL1ixmrVq1i5cqVvo8bGhrIzc1l6dKlJCb68b/qDA6Hg63/+gsAVkxMHJvHZZd2MS1mkHA4HKxfv54lS5Zg7O7/5yAhsYZOJMUrsYbGYInVW1XvjSQ6g8TUnEROVrdwsLSRHGBzvtZvde64tKCcf8ywOKqabORXdkx0fG1rSf5XKkana69eVjfbsXY9sblLW/Or+cEruylvsGE26Fj95alcf1auNvVs8XjOzkvlrld2c7yiiSuf3MT9X57K1zyfD9RRT4tYdxuF9sRi1PPwTYu44g8G/tR6OU9O3MfFta9BQzF8eJ926Yrem/QYoLUOVFenm3wNfH913zT9m9YtT0DdYphwCYxfCvH9H07gbXnMS48jztz7n/iotDjGDIsjv7KZT49WcfmM7H7HEAi7080PXtnNyeoWEixG1lwzfUDvvzvHyht55r8nAFj95akkxXT8h352nlbd2R7CtVbCP+np6ej1esrLyztcX15eTlZWVo/H/va3v+XXv/41H374ITNmzOj2dmazGbO5c3XdaDT2+cFe72lda1HNxFv6fp6B1J+vd6BJrKETSfFKrKER7lj9vW/Z6W6Q8G0cWtJAtRWKalrR6xTmjwlOojO2m8lrxe03C/VTgkWrEAFUWnu/vcut8ocNx7jhuS2UN9gYOyyOd1acy9fOHtkhiVkwNo3/3HU+iyYOw+Z0s+rNfXz/5d00WgPvA/WNls6MD/hY0NrzHr52Bq1Y+OaRs9h4yTq48mlt8IElGQwxaKt+2n+hNm3PoJbqtiTHnAgpeTDiLGxjL+EV5yKedn6Zmolfo0JNJkZthUP/hnfuhN9OgOcuhv8+AmX7MDkboe4klO2Hoi1w7EM48Bbs+htseQY+e1x7//iHUH4QWmpAVTnoSXSm5fTetuZ1kWe09EeHK/r0/eqPFzcXam2QwH/2l2J3dr2x6UByu1VWvbkPh0tl8eQMLp3W+cny7JHJ6HUKJfVWij0vGIjwMJlMzJ07lw0bNviuc7vdbNiwgQULFnR73G9+8xsefPBB3n//febNmzcQoXagb9e6Jhv2CiFE8ElFZ5DwLho/WNpIfKL2BHpWbjLxfrwi74+2yWsdBxKUeieuBVDRAchLj6WqyUaltedqS2Wjjbtf3c2m41qF6to5I3jwqu7X4KTFm3n+lrN47tN8HvngCO9+Ucq+4nqevGEO00f4/8T9SHnfKzpel8/IZlvBKP5v80nufv0ga39wDTmzv952A1UFlwOcVnDa2t667BCTrG2Camh7BXjniSp+dmAro9Ji+e7XFnHWg+vIaj3Kn86uJKfiv1C6B4p3QPEOjB//L5cC7AswaEMMX1FSmGdKJK12FLw/FswJZ1yS2r0fD3oTy0bpeOuzevYeacXdNEKbIqYooOhAZ4QQTYSqbbbz+w3HANApUNfiYNPxqpCN3fbXy9uL2HGyljiTngeunNZlVTHWZGBaTiJ7T9ezvaCG4bMHZiSx6NrKlSu55ZZbmDdvHmeffTZPPPEEzc3NvilsN998M8OHD2fNmjUAPPzww9x777289NJLjB49mrKyMgDi4+OJj+/bCySB8iY6VkzE+tk6LIQQwn+S6AwS3opOQXUzsS7tSdW5Y4NTzQEYm9F1RSfQ0dJeo9Pi2F5YS0U3L2Srqso7e0p48N2DVDfbiTHqefCqaVw3t5upau3odArf/tJYzspL5fsvaS1N1z77Oe99/zzG+5m4HPPsoePv7bvz88sns/tUHV+crmfFS7t49dsL2jbdVBQwmLSLH7ztdOMzElAUhbPGpPOf/U7eSr6UO69+ABpK4dg6OPoBav7HKI4WVGMsiikeTHFaUmLyJCcmLUGhpUo7rrFEm0bnbCWDVjJ0JVBxGPws0JwF7LQALjxzts9gToKk4ZA0ou2S6Hkbl4XB2QyNZYADHFZtfyJnq+f9Fi0J1Bu1uL1fjymOv2wsxmltYnJmGvPy0vnblpP8e29J+BIdVaUmfxf/+c8mzOTyw6WzevzbOGt0KntP17OtsIarAkx06lrsqCqkxPn3+yN6dv3111NZWcm9995LWVkZs2bN4v333/cNKCgqKkKna2tieOaZZ7Db7Vx33XUdznPfffdx//33D0jM3ta1VtUsiY4QQoSAJDqDxLCE/9/encdFXe3/A399ZmeYYZNdBFRAQZZEwYstmmiiRaZlZt6uli2WttueVrborTTNtm+3W937y9I2l25ZKYpbqKmgoYiKICj7vs8MM+f3x4cZGRxgBmaYGXw/H4954Mx8PjPvOeCcec85532k8FVKUd6gwsma9kTHiovU9SM6BVVNRvt+FPdi6hpwufKaqRGd8xWNWLY12zCKM8JPiQ/uHm1x0hEf7IlfHrseC//zJ45cqMHGP4uw7JaoHs+ra9GgtJ5/XRG9nLqmJxUJ8eHd8Zj+/j4cK6zFO7/l4sXpkb16rDPljUYxJQ71wvbsUhzOr8biGwG4BQBj5gNj5qNN1Ypftm/H9JtvMX8OrKYV9RVFuG/9NvhzNXhnqg9cNDV8NTqjSz3/s7X9p07Dj06Bdf3YqjqgvI7fu6gTMYCbActHnwAsBbBUBrA6DrqTCsyRDELhqUBo0q6H2DcC8A4HBoXxiZGt6LRA0SEg539gOdvgVVeErwBoZCKIchOA1iQgZDwwJBGQGY8qJgz1wmf783GkwLJ1Oi1qLaat2wetjiH9mYk2KTF+NVqyZAmWLFli8r709HSj6wUFBbYPqAf68tLNNHWNEEJsgnpXBxI92B27TpeDgYOLWIDRwZ5We+wgTxeIhRxaNToU17UgyJOfilRcpx/RsXTq2pWJjqpNi4/T8/BReh7UbTpIRQI8lhyOB64fBomod8vB3OViPDRhOI789wh+Ol6MF6dHQtjD5oz6Es6B7jKjUtq9NcRLjnfuiMOir47i073nkRDqhSlRfj2f2EVcI/z5hE+/mP3ohRq0aXUQCTu0kUDITxuzhFiG7BZPHGEjEeThApcJkyw6/dsjRXj2++OIDXTDtsXjATCA6fipePUlQF0RUHeRv9RfMlxndZfAaVVgnACcWH55XyKxjC/fLXLh/63VAOpGQN0EqJvQ0lgHqa4FAo6BA4NQ04BoQQOiUQDs+8M4OLcgwDuM3xRWf/EZASj8erepq1YNFOwBTv8EnP4ZaOKrAHIAWpgETZDBm6sHijL4y/41/O/DbxQQPN6Q+IwN4Uddz5Q1oqZJbfbozG8nS1FSxyfjB85V9erviTi/y2t0JJTsEkKIDdA7qwMZFehmWAyeEOrZ6+TAFJFQgJBBrjhX3oi8iiYEecqh1TGU1vVuROdyosNf/+NcJV7eko3zlfwaoBsifPD6jFEIGdT3b+InRPjA3UWM8gYVDp2vwvgeRrr063Mi/K23t0lKtD8WXjcU/96fj1e2ZmNypK9F1eAYY4bNQsPbN+Uc6e8GpUyEhtY25JQ0WLQGqSsnL5m3UagpE0f4AOBworgB5U1t8HVrT35FUsBHCfhEmDyvTa3Crz//hJSbb4VYYt4H/Yy8Ksz910EIBcDvixMw3B1AczW+37EHZ09lYsKgWox3rwYqzwIt1UD9Rf5yPt34gaTu/KiPzwj+p3cEX/1OP22u00+BugljCg5B9N4SfmSrHZO546RiPN4vHom9uli8cUcC7hiqBi78ARRm8D9r8oHSv/jL4f8DAAxSBuArRTD+aAnF+cNqjEmadMWojyk/HLu8X8qu02VXJjptKqDyDLiyHATUngB3wQ1Q+PD7RMm9+ASSOL3La3Sk8KARHUIIsTpKdBxIxw+nSVaqttbRMG8+0Tlf0YgJET6obFShTccgFHDwVVo2ohPansA0t3F4bONxbD/Jl3X1UUqx/JYo3BIb0Kuy0KZIRAJMj/HHN4eLsDWruMdER78+x9qbOD4zdQT+m1GA4rpWXKxpwRAv8xfolzeoUN/aBqGAw7D2CnhCAYeEUC/sOl2OQ/lV1kl09BuFWlBxTc9XKUNskDtOXKxDem4F7kwYYt6JnAA6gdjskRWdjuGNn/kpcHcnhmD44Pb1OApfjJwYgKV/BeHLagGOLp7CF+Nobk94Ks8AVWeBijNAZS5QU8BPqWsv4GAOIQDDKjGFHzDyZiAyFR+dD8A7aecBgF9LNrb9tQ8azm9MC/CjWoUZ7YlPBj+Nr6EE16EE14kPAXs2AXsADAoHBo8BAmIBVx++Sp+LB5+kyDxQopZi/7nK9iAYTp3KBosqAld+iq+eV36Kf71MCxGARADIX2/8QkQyw+a4cPEClH6Awp//qQzgX5vSn79I3Xo36kVsrmN5aXP3MSOEEGI+SnQcyKgOH07HD/ey+uMP81EAKDNUXtOXxPV3k/U4HawzF4kQfm5SlNWrsP1kGTgOuOdvIVg6dYRNNpy8NW4wvjlchF+yS7DitlGQirr+UKAfObF2oiMTCzEq0B1ZRbU4VlhjUaKjjylkkNxoLn7iUD7ROZxfjfuvH9bnGLP1paUH9y5punGEL05crMOu0+XmJzoW+jHzEk4W10MpFeGJyeFG940KdDPs6bPzVBm/wF/uBQSP4y8dtamAqjw+6ak8C1TkAlXn+NLe+ulynX5qBVKcLSpD2NQHIQpJAgQCfLbvPN5JywEAvHxzJO7pavNPtwAgehZ/AfgpeCUncOJwGi6c2IcEcQH8daV8MlZ1Fjix0eTDBADIlkjRIlRCpm2Coq0FMHWozB067xGoramGpwzgWmr5ghNMyxd3aCjhLz0RufAJ0IPpfGJEHIahGAEkcKERHUIIsTpKdBxIkKcLZo0OxIWiixhp5Q/pwOW9dM5X8iMelyuuWTaaoxcVoERZvQqR/kqsvD0W1wzxsEqcpiQO9YK/mwyl9a1Iz63A1FFdbwJ4tlyf6Fi/RGx8sCef6FyowYxrzK+ydaaLcteGTScLqo2KRPRGs7rNUFWvN1PXAGDSSF+sSzuL/ecqoW7TWXX6JMDH+O5vuQCAxZPCMEhhvAEjx3FIjQ3EurSz2Ha8uPtKZiIp4BfFX8yk02iQ+8svGB6UCAgE+OrgBbzxM5/kPDUlwrJkU+IKhCTBUxmHW4+OhkjL4a9nxsCl4jhw6ShQkcMnJi21QGst0FLHj0ABcOVUcNWpAA5QMyHqXIfBZ/jo9tcTDfhGAW6B0La1Yd8vv2D69Ol8UQrG+AISLTWXL81VfMW7xlKgoYxPfhrL+H+r6vhpe7VF/MgOcSiiDlPXqOoaIYRYHyU6DoTjOPxzVjR++aWwTx94u8KP6FzeS6ekveJagHvv5vu/OWMUvti2C0/dNQ4usit3DLcmoYBDalwA/rUvH9uyirtMdKoaVahsVIPjgDBfGyQ6IR74/ABwtLDGovMub2BqnOhEB7rDRSxETbMG5yoa+zQKlVPSAMbaK/i59S55jRnsDm+FFJWNKvxZUG3Vyn8A8K+9+Sitb0WQpwsWjA81eUxqHJ/o7D1TgdpmNTzktim//MPRi3h5SzYAYNGE4Xh0UlivHifI08WQhGdWCzE+4iYg4iaTx2ZdqML8j3fCV9yMLfeNwt78Rjz6ewNG+QzC1tuv6/nJOA6QufEXzy5GnjpSN/MJUHM1X+CCOBShVl9eWkJT1wghxAas+3UtcWj6EZ2SulY0qdoMU9csLUSg56OUItqTGVcLsyH9CMrOnDI0tGpMHnOmfX3OEE+5TaoYxbdXwsspaUCzus3s8/RxdR7RkYgEiA/xAAAcyresRHFnl9fn9P6be4GAay9KAENhDGspq2/FJ3vyAADPTxvZZTndMF8FogLc0KZj+DW71Kox6G3PLsUz3x8HACwYH4rnUkb0ek0Zx3FI0I/M5XefAP+QWYI6KBA16hq4Dk3EmLHj0QYRjl+sQ3lDa6+ev1sSOeA1DAgaa/3HJn0maB/RaQat0SGEEFugEZ2riIdcAi9XCaqb1MivbEJJe2npwb2cutbfOq7f+P1kGW43sfmofuTE2utz9AI9XBDgLkNJXStOXKzD38woGsEYM5SWNjWdLjF0EA6cq8Lh/Oqu14eY4XLFtb4VNZg00hffH72I3afLzdq3yFyrf89Fi0aL+GAP3BwT0O2xqXGBOFVSj23Hi3FXYrBZj9+m1eHrw4VQt+ngo5Qa9qbyUcrgJhMZEpnsGg5fHPoLOgbMGTsEy2+J6nPhjIRQT/x0vBhHLnSdrKratNh2vBgAcHs8/7fr69ahAMRpCwpAkAGBM6zRkdIaHUJsRKvVQqvV2juMbmk0GohEIrS2tlKs7cRiMYTCvr8vUqJzlRnm7YrqJjXyKhoNm4X2dupaf+M4DjPiBuO9nWew9XhxD4mO9aet6cUHe+Lnv0pwrLDGrETnUm0LmtRaiIWcYaPVjvTrdA7nV4Ex1usP3dn6EZ3BfVuLcV24N0QCDucrm1BQ2WQyZkudKq7Hd0f5ksovm5FY3BIbgH/+ehoZ56tQXt9q1lS8d38/Yxgx6kwiEsBHIYW3QoKTlwRoYwwzrgnEW7NirDJNNCGU/x0eM7UnUru0nHLUtWjg7yYzmhI4aSRfACLtdBklOlcZgZYf0dFwUoj7aWSckKsFYwxKpRLnz5+3WhVYW2GMwd/fH0VFRRRrBx4eHvD39+/T81Cic5UZ5uOKIxdqcL6iqUMxAudIdABgxjWBeG/nGRw4V4mKBhV8lMZrg8502pTTFkYHe/CJzgXz1unoy10P81aY/DAzOtgDYiGHsnoVCqube7X3kLpNZ3jtfR3RcZOJkRDqhYzzVdh1uhz3XTe0T4/HGF9OmjF+pCbejI1wh3jJMTrYA5mFtfjlrxIsuLb7GPadrTAkOZMj/dCo0qCiQYWK9rLe6jYdLtW2tE/X5DAl0hfvzo6zuNpgV0b4KeEmE6G+tQ2nSuoRG+RxxTE/tCd6M+MHGz1v8kg/rN15FvvOVkLVpu22oiAZWPRV17Qi53kPJsRZlJeXw9PTEz4+PlAoFA6dQOh0OjQ2NkKhUEAgcOwvPfojVsYYmpubUV7OT6EPCOh+Fkh3KNG5ygxvL0iQU1KPqib+28TBTpTohHq7Im6IB44X8R+A53dY0M4YM6yF0W/KaQvxIfwH9WOFtWaNwOQaChGYHmWSiYWIC/LAkQs1OJRf3atE50xZAzRaBncXMYI8+/77nDTSFxnnq7A7t++JzqH8avyRVwWJSIBnp44w+7xb4wKRWViLn050n+hUNqrw1Lf8ept544Lx5swYo/tbNVo+6WlUobSmGZmZR/HknFirfoMuEHAY274n0p8FNVckOhUNKqSfqQBwedqa3qhAN/gqpShvUOFwfjWuD/exWlzEsek3DNVRokOIVWm1WtTX18Pb2xuDBg1yiuRBrVZDJpNRrO1cXPj3xfLycvj6+vZ6GptjtyaxOn3ltYzzVQAAuUQINxfnyndnxAUCALZmXTK6vbxBhboWjdGmnLYwKtANEpEA1U1qXKhq7vH4rkpLd3R5+lrvChLoCxGMCnSzyrdWN47kN/E8dL4aTSrziy6Y8n37SMbt8YMt2nvo5pgAcBxw9EINLtaYbmedjuHpb4+jokGFCD+FyTVFMrEQQ7zkiA/2xJQoX0R7MptMExobyifAf5r4HW7NugStjiFuiMcV1QAFAg6T2ts7Lce6BSCIY9MnOhCb//+CENIzjYYvWCSR2KZqJ+kfcjn/3qj/ffYGJTpXGX0C0NDKf3gN9HBx6OFcU26JDYCA40dUCjskGvqEovOmnNYmFQkR074h5zEzykx3VVq6o74mOtmX+rZRaGfDfVwR7CWHWqvD/nOVvX6cFrUW2//iN7WcFX/lmqru+LrJ8Leh/Bqo/50wvTHmv/fnY8+ZCkhFAnxwd7xNf+89SQy9vCcSY8zovh+O8Un5HfGm9wUyJDqny644lwxcIsZPXdOJKNEhxBac7fMNMWaN3x8lOleZYC85RB3WBwS4O0fFtY583WQYP5xfzP3TiWLD7bmlPY+cWEt8sAcAfrShO1odw7ny9tLS3awbGhPiCQEHFFY3G6rhWaLjiI41cNzlUYbdfSgz/fupUjSptRji5YKxIT2vzekstX307qfjxVfcd+JiLd7+7TQAYHlqlM0q7ZkrJsgdEpEAVU1qnK9sMtx+qrgeOSX1kAgFhtfT2bVh3pCIBCiqbjFs+koGPnH7Gh2BhBIdQgixBUp0rjJioQDBHaYPOdP6nI5uvYb/wLgl85LhG3D9ov/uRk6sRb+g/lhhbbfHFVU3o1Wjg1Rk3O6dKWViQxEBS0d1tDqGUyXWKS3dkX762u7c8l6PMvzYPpIxc3RQr76ZmRbtD5GAw8nieqMEoFHVhse+yYRGyzAt2h93m1mC2pakIiGuaV+bc6Tg8u/wh2P81L3kSN8uNz91lYqQ1F7Bj6avXSUYg4jxU9c4SnQIITYQGhqKtWvX2jsMu6JE5yrUcf2KM1Vc6ygl2h8SkQBnyxtxun0kJ9eMtTDWoi9IkFtaj8Zu1rDop62F+Sp6rPDV2+lr5ysa0arRQS4RYqgVSkHrjRvqBRexEGX1Kpwsrrf4/PL6Vuw7yy/AnzXa9JStnni6SnB9ePvoXYdRnWVbslFQ1YzBHi5YNSvWYaYnJAzl/y4Ot28cqtHqDGvJOhch6Cw5Uj99jRKdq4JWDSF0AGhEhxBy2cSJE/HEE09Y5bH+/PNPPPjgg1Z5LGdFic5VSF95DXDOqWsAXwJ50gj+g+HWrOIeN+W0Nj83GQZ7uEDHgBNFtV0eZ8kGpr1NdPRJSGSAm9XKJQP8In79fi8//2V6jUx3th0vho7x0/z6shdPx+lrjDH8cPQiNmdegoAD1t11Ddzl4l4/trUldFinAwB7z1SgslGNQa4STBjRfTW1G9v/no9eqEFts9qs5ztX3ohP9+ZB3abrQ9TELjSXp6gKpLYrnkIIGVgYY2hrM69IkI+Pj2FB/9WKEp2rUMcRHWedugbwe+oAwLasS7hY0/2mnLagH9Xpbp2Oody1GcmX/kPy2fJGQ+lvc2Rfat8o1Errczq6o31T1q8yLqCuxbKqJ/oF+JYWIehsSpQfpCIB8iqa8MtfpVi2NRsA8MTkCIxtbzNHER/iCa59rVVZfath2tqMawb3WOltiJccEX4KaHUMe9pLUXenokGFu/91EG/9chob/yy0SvykH7UnOhomhEwq7eFgQsjV4N5778WePXuwbt06cBwHjuPw5ZdfguM4bN++HWPGjIFUKsX+/fuRl5eHGTNmwM/PDwqFAgkJCdi5c6fR43WeusZxHD777DPMnDkTcrkc4eHh2LZtm1mxabVaLFy4EMOHD0dAQAAiIyOxbt26K477/PPPMWrUKEilUgQEBGDJkiWG+2pra/HQQw/Bz88PMpkM0dHR+N///te7xjITJTpXoWEdRnScdeoawK8hUUpFKK5rxdeH+Q96XW3KaQv6ggTdVV4zp7S0nperxDAa1VORg46y9YUIrFRxraObovwwwk+JBlUbvjxQYPZ5OSWXF+DfEtv7jb4Afv2SvjDCYxsz0azW4m/DvLD4xrA+Pa4tuMnEiPTnE84dp8qw8xQ/De32MeZN3Zs00g8AsKuH6WtaHcOTm7JQ3sAvZv+lFyNuxM7a+IqRLZDYtVogIVcLxhia1W12uZi7znXt2rVISkrCAw88gJKSEpSUlGDIkCEAgOeffx6rVq1CTk4OYmNj0djYiOnTpyMtLQ2ZmZlISUlBamoqCgu7/+Lrtddew5133okTJ05g+vTpmDdvHqqre55JotPpEBQUhE2bNuHgwYN4+eWX8eKLL+Lbb781HPPxxx9j8eLFePDBB/HXX39h27ZtCAsLM5w/bdo0HDhwAF999RVOnTqFVatW9Xp/HHM51wYqxCrCfBQQcIBIIIC/k05dA/ipVVOj/fH90YuGD+HmjJxYy5j2EZ3MolrodAyCTtPG2rQ6nK/gq2+ZWxEscagXzpQ14s+CGow243jGmGHqmrUqrnUkEHBYMikMj36Tic8P5OO+60KhlPU8VWxzJj+aM2lk1wvwLZEaF4jt2aXQ6hg85WKsnTPaqtP0rClxqBdOldTjvR1noNbqEBngZnaRiORIX3yyJw/puRVo03Y9He3D3eew/1wlZGIBWjU6HM6vRlWjCoMUNDLgNNT6REcKuYQSHUJsrUWjRdTy3+zy3KdWTIVc0vNHbnd3d0gkEsjlcvj7+wMATp/mq4uuWLECU6ZMMRzr5eWFuLg4w/XXX38dmzdvxrZt24xGUTpbsGAB5s6dCwB466238P777+Pw4cNISUnpNjaxWIzXXnsNOp0O9fX1iImJwaFDh/Dtt9/izjvvBAC88cYbePrpp/H4448bzktISAAA7Ny5E4cPH0ZOTg4iIiIAAMOGDeuxTfqKRnSuQp6uEqyfG48P7h7t9N8k6qevtWi0APqnEIFeZIAbZGIBaps1RuWE9QqqmqHW8kUCzJ0imNi+b8yfZo7oFFW3oKG1DRKhAOG+tnnt02MCMMzHFXUtGvy/gxd6PF6rY9jSnujM7GLfGEtNGukLNxnfSbxzR5xDJ+j6KYj66Ye3W9AGo4d4wEMuRl2LpsuKfn/kVWLtzjMAgDdvi0HMYHfoGPD7qbK+BU76FdfGT11rYZToEEJ6NnbsWKPrjY2NWLp0KSIjI+Hh4QGFQoGcnJweR3RiY2MN/3Z1dYWbmxvKy80rgvPhhx8iISEBYWFhcHNzw6effmp4vvLychQXFyM5OdnkuVlZWQgKCjIkOf2FRnSuUjf3cTqRo0gaNgjeCikqG/kpPP1RWlpPLBQgdrAHDhdU41hhzRU73hs2CvVVXDHa0xX9ppM5JQ1oMePzsX7aWoS/AhKRbb63EAo4LLkxDE99exyf7cvHgvGh3X4zdeBcJcobVPCQiw0L7PtKJhbimwf/hroWjWEPJUeVEHp5vyChgMOMa8xPdERCASZG+GBLVjHSTpdhdJDx33N5Qyse+yYLOgbcOTYIt48JQml9K/66VIft2aWY6wBltomZ2tfo0NQ1QvqHi1iIUyum2u25+8rV1Xj98dKlS7Fjxw68++67CAsLg4uLC+644w6o1d2v8RWLjWdlcBwHna7ngjYbN27E0qVL8e677yImJgb+/v5YvXo1Dh06BABwcen+C92e7rcVGtEhTk3UaQ1Id5ty2sLoEA8AQKaJdTqWVFzT83eXIWSQHDoGnG/oOTnSbxQabcX9c0y5NS4QIYPkqG5SY8PB7r8t0k9bS40NtGryNSrQ3eGTHIDf0DZkEF/lZmKED3yUlk0nmxTZvk6n0346Wh3D499kobJRhRF+Srx2azQAfq8hAPjjXCXqmi0rGEHsSM2PAvNT1+g7R0JsjeM4yCUiu1ws2QJBIpFAq9X2eNyBAwewYMECzJw505B4FBQU9KGFen6+8ePH4+GHH0ZsbCzCwsKQl5dnuF+pVCI0NBRpaWkmz4+NjcXFixdx5swZm8VoCiU6xOnpp68ppKJuN+W0hTH6jUMv1F5xX28SHeDyqE5efc9vjNmX2tfn2KAQQUcioQCPTBwOAPi/vefRqjH9JtykasOv2aUAgFlWmrbmjG6NC4RQwOG+64ZafO6EcB8IBRzOljeiqKbZcPv7aWeRcb4KcokQH86Lh0v7dKdhPgpE+CnQpmPYmUPT15xGh6lrLhLqigkhvNDQUBw6dAgFBQWorKzscrQlPDwcP/74I7KysnD8+HHcfffdZo3M9FZ4eDiOHDmC3377DefOncPy5cvx559/Gh3z6quvYvXq1Xj//fdx9uxZHDt2DOvXrwcATJgwATfccANuv/127NixA/n5+di+fTt+/fVXm8UMUKJDBoDRwZ54d3YcPpwX3+8L1PUlps+UN6C+1fjbdH1p6QgLR5n0++mcrOHQou76Wx2+EEF7xTUbFCLobOboIAz2cEFlowobD5se1fk1uxQtGi2GervimiEeNo/JUT05OQJZy6cY9iGyhLtcjLHtf1fpuZUAgAN5VXh/11kAwFszY66YJpkSzY9q/nqytC9hk/7UYeqai5hGdAghvKVLl0IoFCIqKgo+Pj5drrlZs2YNPD09MX78eKSmpmLq1KmIj4+3WVwPPfQQZs2ahblz52Ly5MmoqqrCI488YnTM/PnzsXbtWnz00UcYNWoUbrnlFpw9e9Zw/w8//ICEhATMnTsXUVFRePbZZ80aveoLenclA4J+v5f+5q2QIthLjsLqZmQV1uKGCH5TSFWbFvmV+oprllWCmxDhA7lEiNIWLRb85yi+WJBoclPM8gYVKhvVEHAwlDS2JYlIgIcnDsfLW7LxyZ7zmDsuGFKR8bzjHzP5fWNmjh5s0VD9QCMQcGZVp+tKcqQvDuVXY3duBaa4Ayu++wuMAXMTh+C20VeOlE2L9sf7aWex90wFmlRtcJXSW7uj4zT8aF0rpFBSMQJCSLuIiAhkZGQY3bZgwYIrjgsNDcWuXbuMblu8eLHR9c5T2UyVua6trTUrLqlUii+++AL//ve/UV9fDzc3NwgEAqxcudLouIceeggPPfSQycfw8vLC559/btbzWQuN6BDSR6b208mvbIJWx6CUiuDvZlmFMF83GT7/RzxchAzHCmsx59MMlNe3XnGcfqPQMF+FYRqTrc0eGwR/NxlK61vx/dGLRveV1LXij7wqAHyiQ3pPv2/QwfxqfHlGiKomNUb6K/FK6iiTx4/0VyJ0kByqNh1255pXPYfYWfuITjNVXSOEEJuhRIeQPtLvp9OxHHDHaWu9GdkYE+KJx0Zp4auU4nRpA27/5A9cqDIuYW1Yn2PjQgQdSUVCPDSBr3v/0e48aDrs9bLteAkY49cYDenntVIDzXAfBYK95NBoGc43cHBtX5fTVXUujuMM09e2Z9P0NaegubxhqDUqMhFCSF8sWrQICoXC5GXRokX2Dq/XKNEhpI9GtxckyCysgU7HDwufKdUXIuj9BqaBrsA39ycgZJAcRdUtuP3jDJxq3xwUQL+uz+lobmIwvBVSXKptweZjfIU1xoAtWcUAru4iBNbCcZxhVAcAXp8RheE+3f8t6auv7T5d3mWxCOJADGt0pP02IksIIV1ZsWIFsrKyTF5WrFhh7/B6jRIdQvpopL8ScokQDa1tOFfBj+T0tuJaZ8Fecny3KAmRAW6obFRhzqcZ+LOgGgBwsj3pibZxxbXOZGIhHryBryb2Yfo5tGl1uNgEnKtogkQkwLSYgbFHk73NSRgCpUyESYE6pJqx71VskDsGe7igWa3F3jMV/RAh6RP9iA5NXSOEOABfX1+EhYWZvPj6WmdPPHugRIeQPhIJBYgN4pONYxf4dTrWSnQAwFcpw8YH/4bEUC80tLbh758dwg9HL+JSLf+NcFQ/j+gAwLxxIfCUi3Ghqhk//1WKPyv5t5IpUX5wd+n9InxyWWSAG46+eCNmhJhXLpTjOEwdxY/q/ErT1xyeJnIWXtLch926a2jqGiGE2AglOoRYweV1OjVo1WhxoZr/ttYaiQ4AuLuI8d+FiUge6QtVmw5Pf3ccABAySA63PlT36i1XqQj3X9++VmdPPo5W8uuQZlERAquydH3XtBg+0dmRUwZ1m+32UyB91+yfgA3ayTjBhtPUNUIIsRFKdAixgvj2dTpHL9TgXHkjGAM85WJ4KyRWew6ZWIhP7hljlExE92Mhgs7+kRQCdxcxzlc2oVHDwctVbCivTexjTLAnfJRSNLS24Y+8SnuHQ7rR3L5HloADJELqigkhxBbo3ZUQK9AXJMiraMLhfH4NTYRf7yqudUcsFODd2XF44PqhEAo43DTKz6qPbwmlTIx7rw01XL8lJgBi+sBmVwIBh5ui+L8Jmr7m2Fo1/Iibi0R4Ve85RQghtkSfSgixAi9XCYZ6uwIAvj1SBMB609Y6Ewg4vHRzFE6+NhUzrrHvVLF7xw+FUsZvTjlrdKBdYyG8ae1lpn8/VYY2LU1fc1T6ER1an0MIIbZDiQ4hVqKfvnbaCqWlzdHVnir9yV0uxlf3jcWiSG2/l7kmpo0b5gUPuRjVTWr8WVDT8wnELvQlwCnRIYRYU2hoKNauXWvvMBwGJTqEWEl8iIfRdVuN6DiaqAA3RHowe4dB2omFAkyJ1E9fK7FzNKQrzZToEEKIzVGiQ4iV6Ed09K6WRIc4Hn31tV9Plho2sSWOpVU/dY0qrhFCiM1QokOIlUT4KaGQ8utVfJRSeLpar+IaIZa4NswbSqkIZfUqZBbV2jscYsLlER3qhgkhvE8//RSBgYHQ6YzXV86YMQP33Xcf8vLyMGPGDPj5+UGhUCAhIQE7d+7s9fOtWbMGMTExcHV1xZAhQ/DII4+gsbHR6JgDBw5g4sSJkMvl8PT0REpKCmprawEAOp0Ob7/9NsLCwiCVShEcHIw333yz1/HYAr3DEmIlQgGHa4Z4ALD9+hxCuiMVCTEpkt/JmqavOSbDGh0a0SGkfzAGqJvsc2HmjazPnj0bVVVV2L17t+G26upq/Prrr5g3bx4aGxsxffp0pKWlITMzEykpKUhNTUVhYWGvmkQgEOD999/HyZMn8Z///Ae7du3Cs88+a7g/KysLycnJiIqKQkZGBvbv34/U1FRotfz71wsvvIBVq1Zh2bJlOHXqFL7++mv4+dmvGqwpInsHQMhAcn24N/afq8SYEC97h0KuctOi/bE1qxjbs0vx4vRIKmHsYPRV1+Ri6oYJ6ReaZuAtO1UHfbEYkLj2eJinpyemTZuGr7/+GsnJyQCA77//Ht7e3rjxxhshEAgQFxdnOP7111/H5s2bsW3bNixZssTisJ544gnDv0NDQ/HGG29g0aJF+OijjwAAb7/9NsaOHWu4DgCRkZGor69HQ0MD1q1bhw8++ADz588HAAwfPhzXXXedxXHYEo3oEGJFC68bis8XjMUjE4fbOxRylZsQ4QuZWICLNS04WVxv73BIJy3tiY5MQt0wIeSyefPm4YcffoBKpQIAbNiwAXfddRcEAgEaGxuxdOlSREZGwsPDAwqFAjk5Ob0e0dm5cyeSk5MxePBgKJVK3HPPPaiqqkJzczOAyyM6puTk5EClUnV5v6Ogr5IIsSKRUIBJIx1r2JZcnVwkQkyM8MWvJ0uxPbsE0YPd7R0S6aClfcNQOVVdI6R/iOX8yIq9nttMqampYIzh559/RkJCAvbt24f33nsPALB06VLs2LED7777LsLCwuDi4oI77rgDarXa4pAKCgpwyy234OGHH8abb74JLy8v7N+/HwsXLoRarYZcLoeLi0uX53d3nyOhr5IIIWSA0ldf255dCmbmHHHSP1ra1+g4wn5YhFwVOI6fPmaPiwVTh2UyGWbNmoUNGzbgm2++wYgRIxAfHw+ALwywYMECzJw5EzExMfD390dBQUGvmuPo0aPQ6XRYvXo1/va3vyEiIgLFxcaJYGxsLNLS0kyeHx4eDhcXly7vdxQ0okMIIQPUpJG+kAgFOF/RhPzKJgzzoSIZjqKFihEQQrowb9483HLLLTh58iT+/ve/G24PDw/Hjz/+iNTUVHAch2XLll1Roc1cYWFh0Gg0WL9+PVJTU3HgwAF88sknRse88MILiImJwSOPPIJFixZBIpEgLS0NKSkpGDp0KJ577jk8++yzkEgkuPbaa1FRUYGTJ09i4cKFfXr91kQjOoQQMkApZWKsvjMOu56eQEmOg1l4bQgeidTi1tgAe4dCCHEwkyZNgpeXF3Jzc3H33Xcbbl+zZg08PT0xfvx4pKamYurUqYbRHkvFxcVhzZo1+Oc//4no6Ghs2LABK1euNDomIiICv//+O44fP47ExEQkJSVh27ZtEIn4cZJly5bh6aefxvLlyxEZGYk5c+agvLy89y/cBmhEhxBCBrDUODtVGSLdCh3kihEeDCGDzJ+7Twi5OggEgiumkQF8ZbRdu3YZ3bZ48WKj65ZMZXvyySfx5JNPGt12zz33GF2fMGECDhw4YLiu0+lQX19viPOll17CSy+9ZPZz9jca0SGEEEIIIYQMOJToEEIIIYQQMoBs2LABCoXC5GXUqFH2Dq/f0NQ1QgghhBBCBpBbb70V48aNM3mfWCzu52jshxIdQgghhBBCBhClUgmlUmnvMOyOpq4RQgghhBBCBhxKdAghhBBCyIBDGyU7N2v8/ijRIYQQQgghA4Z+DYparbZzJKQvmpubAfRtTRGt0SGEEEIIIQOGUCiEm5sbKioqIJPJoFAowHGcvcPqkk6ng1qtRmtrKwQCxx6D6I9YGWNobm5GeXk5PDw8IBQKe/1YlOgQQgghhJABxdfXF2fOnIFUKkVlZaW9w+kWYwwtLS1wcXFx6IQM6N9YPTw84O/v36fHoESHEEIIIYQMKBzHoaGhAePHj7d3KD3SaDTYu3cvbrjhBocv/dxfsYrF4j6N5Oj1KtH58MMP8c4776C0tBRxcXFYv349EhMTuzz+u+++w7Jly1BQUIDw8HD885//xPTp03sdNCGEEEIIIT0RCoUOnzwIhUK0tbVBJpNRrFZm8eS6TZs24amnnsIrr7yCY8eOIS4uDlOnTkV5ebnJ4//44w/MnTsXCxcuRGZmJm677TbcdtttyM7O7nPwhBBCCCGEEGKKxYnOmjVr8MADD+Dee+9FVFQUPvnkE8jlcnz++ecmj1+3bh1SUlLwzDPPIDIyEq+//jri4+PxwQcf9Dl4QgghhBBCCDHFoqlrarUaR48exQsvvGC4TSAQYPLkycjIyDB5TkZGBp566imj26ZOnYotW7Z0+TwqlQoqlcpwvb6+HgA/L1Cj0VgSsuG8jj8dGcVqO84UL8VqG84UK+AY8TpLWxFCCCGdWZToVFZWQqvVws/Pz+h2Pz8/nD592uQ5paWlJo8vLS3t8nlWrlyJ11577Yrbt2zZArlcbknIRrZu3drrc/sbxWo7zhQvxWobzhQrYN949fsY0MZ7xvTtof8izlIajQbNzc2or693innuzhQvxWo7zhQvxWobjhKr/r23p77JIauuvfDCC0ajQJcuXUJUVBTuv/9+O0ZFCCFXr4aGBri7u9s7DIfR0NAAABgyZIidIyGEkKtXT32TRYmOt7c3hEIhysrKjG4vKyvrss61v7+/RccDgFQqhVQqNVxXKBQoKiqCUqnsVc3u+vp6DBkyBEVFRXBzc7P4/P5EsdqOM8VLsdqGM8UKOEa8jDE0NDQgMDDQLs/vqAIDA6+afglwrngpVttxpngpVttwlFjN7ZssSnQkEgnGjBmDtLQ03HbbbQD4HVLT0tKwZMkSk+ckJSUhLS0NTzzxhOG2HTt2ICkpyeznFQgECAoKsiRUk9zc3Bz+D0iPYrUdZ4qXYrUNZ4oVsH+8NJJzpauxXwKcK16K1XacKV6K1TYcIVZz+iaLp6499dRTmD9/PsaOHYvExESsXbsWTU1NuPfeewEA//jHPzB48GCsXLkSAPD4449jwoQJWL16NW6++WZs3LgRR44cwaeffmrpUxNCCCGEEEKIWSxOdObMmYOKigosX74cpaWluOaaa/Drr78aCg4UFhZCILhctXr8+PH4+uuv8fLLL+PFF19EeHg4tmzZgujoaOu9CkIIIYQQQgjpoFfFCJYsWdLlVLX09PQrbps9ezZmz57dm6eyCqlUildeecVo3Y+jolhtx5nipVhtw5liBZwvXmI+Z/vdOlO8FKvtOFO8FKttOFOsAMAxqhlKCCGEEEIIGWAEPR9CCCGEEEIIIc6FEh1CCCGEEELIgEOJDiGEEEIIIWTAuaoSHY7jsGXLFnuHYRZnirWzgoICcByHrKwse4fSI2eKFeCLfXAch9raWnuH0iOK1TacKVZiHmd5v3eWOLviTO/3zhQr4FzvS84Sq7PEqeeo8Q64ROfDDz9EaGgoZDIZxo0bh8OHD9s7JJNeffVVcBxndBk5cqS9wwIA7N27F6mpqQgMDDTZsTHGsHz5cgQEBMDFxQWTJ0/G2bNnHTLWBQsWXNHOKSkpdol15cqVSEhIgFKphK+vL2677Tbk5uYaHdPa2orFixdj0KBBUCgUuP3221FWVuaQsU6cOPGKtl20aFG/xwoAH3/8MWJjYw0bmCUlJWH79u2G+x2lXc2J1ZHalViPM/RNjtwvAdQ32Qr1TbbhTP2SOfE6SrtaakAlOps2bcJTTz2FV155BceOHUNcXBymTp2K8vJye4dm0qhRo1BSUmK47N+/394hAQCampoQFxeHDz/80OT9b7/9Nt5//3188sknOHToEFxdXTF16lS0trb2c6Q9xwoAKSkpRu38zTff9GOEl+3ZsweLFy/GwYMHsWPHDmg0Gtx0001oamoyHPPkk0/ip59+wnfffYc9e/aguLgYs2bNcshYAeCBBx4watu3336732MFgKCgIKxatQpHjx7FkSNHMGnSJMyYMQMnT54E4Djtak6sgOO0K7EOZ+qbHLVfAqhvshXqm2zDmfolc+IFHKNdLcYGkMTERLZ48WLDda1WywIDA9nKlSsZY4wBYJs3bzbcv3z5cubv78+OHz/e36GyV155hcXFxXV5v6PE2jkOnU7H/P392TvvvGO4rba2lkmlUvbNN98wxhjLz89nAFhmZiZjjLG2tjZ27733shEjRrALFy70W6yMMTZ//nw2Y8aMLs+xV6yMMVZeXs4AsD179jDG+HYUi8Xsu+++MxyTk5PDALCMjAzGGGO7d+9mAFhNTQ1jjLGmpiaWkpLCxo8fb7itP2JljLEJEyawxx9/vMtz7BWrnqenJ/vss88cul07x8qY47crsZyz9E3O0i+ZioX6Juuhvsl2nKlf6hgvY47drt0ZMCM6arUaR48exeTJkw23CQQCTJ48GRkZGUbHMsbw6KOP4r///S/27duH2NjY/g4XAHD27FkEBgZi2LBhmDdvHgoLC684xlFi1cvPz0dpaalRO7u7u2PcuHFXtDMAqFQqzJ49G1lZWdi3bx+Cg4P7M1wA/LxRX19fjBgxAg8//DCqqqpMHtffsdbV1QEAvLy8AABHjx6FRqMxatuRI0ciODjYZNvW1tZiypQp0Ol02LFjBzw8PPotVr0NGzbA29sb0dHReOGFF9Dc3Gzy/P6MVavVYuPGjWhqakJSUpJDt2vnWPUcsV1J7zhb3+SM/RJAfZM1Ud9kfc7UL5mKV8/R2tUcIrs9s5VVVlZCq9XCz8/P6HY/Pz+cPn3acL2trQ1///vfkZmZif3792Pw4MH9HSoAYNy4cfjyyy8xYsQIlJSU4LXXXsP111+P7OxsKJVKh4q1o9LSUgAw2c76+/QaGxtx8803Q6VSYffu3XB3d++3OPVSUlIwa9YsDB06FHl5eXjxxRcxbdo0ZGRkQCgU2i1WnU6HJ554Atdeey2io6MB8G0rkUiueEMw1balpaWYM2cOwsPD8fXXX0MikfRrrABw9913IyQkBIGBgThx4gSee+455Obm4scff7RLrH/99ReSkpLQ2toKhUKBzZs3IyoqCllZWQ7Xrl3FCjheu5K+caa+yVn7JYD6Jmuhvsm6nKlf6i5ewLHa1RIDJtEx15NPPgmpVIqDBw/C29vbbnFMmzbN8O/Y2FiMGzcOISEh+Pbbb7Fw4UIAjhNrb82dOxdBQUHYtWsXXFxc7BLDXXfdZfh3TEwMYmNjMXz4cKSnpyM5OdlwX3/HunjxYmRnZ/d6/vuUKVOQmJiITZs2GXWKttBVrA8++KDh3zExMQgICEBycjLy8vIwfPjwfo91xIgRyMrKQl1dHb7//nvMnz8fe/bssegx7B1rVFSUw7Ur6R+O8H5/NfRLAPVN3aG+ybqcqV8CBmbfNGCmrnl7e0MoFF5RsaKsrAz+/v6G61OmTMGlS5fw22+/9XeI3fLw8EBERATOnTtnuM0RY9W3ZU/tDADTp0/HiRMnTA7D2suwYcPg7e1t1M5A/8a6ZMkS/O9//8Pu3bsRFBRkuN3f3x9qtfqK0oym2vbmm2/G3r17cerUKbvEasq4ceMA4Iq27a9YJRIJwsLCMGbMGKxcuRJxcXFYt26dQ7ZrV7GaYu92JX3jzH2Ts/RLAPVN1kB9k/U5U7/UXbymOEvfNGASHYlEgjFjxiAtLc1wm06nQ1pamtH8wltvvRVff/017r//fmzcuNEeoZrU2NiIvLw8BAQEGG5zxFiHDh0Kf39/o3aur6/HoUOHjNoZAB5++GGsWrUKt956q8XfYNjKxYsXUVVVZdTOQP/EyhjDkiVLsHnzZuzatQtDhw41un/MmDEQi8VGbZubm4vCwsIr2nbVqlWYP38+kpOTbfJm0lOspuj3e+jctraOtSs6nQ4qlcqh2rWnWE1xtHYllnHmvslZ+iWA+qa+oL6p/95Dnalf6hivKY7Urt2yWxkEG9i4cSOTSqXsyy+/ZKdOnWIPPvgg8/DwYKWlpYwx48on3333HZPJZEYVL/rT008/zdLT01l+fj47cOAAmzx5MvP29mbl5eV2j7WhoYFlZmayzMxMBoCtWbOGZWZmGiq9rFq1inl4eLCtW7eyEydOsBkzZrChQ4eylpYWxtiV1WLee+89plAo2L59+/o11oaGBrZ06VKWkZHB8vPz2c6dO1l8fDwLDw9nra2t/R7rww8/zNzd3Vl6ejorKSkxXJqbmw3HLFq0iAUHB7Ndu3axI0eOsKSkJJaUlGS4v3NVkyeeeIL5+fmxnJycfo313LlzbMWKFezIkSMsPz+fbd26lQ0bNozdcMMN/R4rY4w9//zzbM+ePSw/P5+dOHGCPf/884zjOPb7778zxhynXXuK1dHalViHs/RNjtwvMUZ9E/VNztU3OVO/1FO8jtSulhpQiQ5jjK1fv54FBwcziUTCEhMT2cGDBw33dXyTZoyxTZs2MZlMxn744Yd+j3POnDksICCASSQSNnjwYDZnzhx27tw5h4hV/8fa+TJ//nzGGF/Gc9myZczPz49JpVKWnJzMcnNzDed3foNmjLHVq1czpVLJDhw40G+xNjc3s5tuuon5+PgwsVjMQkJC2AMPPGD4cNHfsZqKEwD74osvDMe0tLSwRx55hHl6ejK5XM5mzpzJSkpKrni9HUs1PvrooywgIMDod2DrWAsLC9kNN9zAvLy8mFQqZWFhYeyZZ55hdXV1/R4rY4zdd999LCQkhEkkEubj48OSk5MNnQljjtOuPcXqaO1KrMcZ+iZH7pcYo76J+ibn6pucqV/qKV5HaldLcYwxZvk4ECGEEEIIIYQ4rgGzRocQQgghhBBC9CjRIYQQQgghhAw4lOgQQgghhBBCBhxKdAghhBBCCCEDDiU6hBBCCCGEkAGHEh1CCCGEEELIgEOJDiGEEEIIIWTAoUSHEEIIIYQQMuBQokOIlSxYsAC33XabvcMghBBCAFC/RAglOoQQQgghhJABhxIdQiz0/fffIyYmBi4uLhg0aBAmT56MZ555Bv/5z3+wdetWcBwHjuOQnp4OACgqKsKdd94JDw8PeHl5YcaMGSgoKDA8nv4bt9deew0+Pj5wc3PDokWLoFar7fMCCSGEOBXqlwgxTWTvAAhxJiUlJZg7dy7efvttzJw5Ew0NDdi3bx/+8Y9/oLCwEPX19fjiiy8AAF5eXtBoNJg6dSqSkpKwb98+iEQivPHGG0hJScGJEycgkUgAAGlpaZDJZEhPT0dBQQHuvfdeDBo0CG+++aY9Xy4hhBAHR/0SIV2jRIcQC5SUlKCtrQ2zZs1CSEgIACAmJgYA4OLiApVKBX9/f8PxX331FXQ6HT777DNwHAcA+OKLL+Dh4YH09HTcdNNNAACJRILPP/8ccrkco0aNwooVK/DMM8/g9ddfh0BAA6+EEEJMo36JkK7RXyohFoiLi0NycjJiYmIwe/Zs/Otf/0JNTU2Xxx8/fhznzp2DUqmEQqGAQqGAl5cXWltbkZeXZ/S4crnccD0pKQmNjY0oKiqy6eshhBDi3KhfIqRrNKJDiAWEQiF27NiBP/74A7///jvWr1+Pl156CYcOHTJ5fGNjI8aMGYMNGzZccZ+Pj4+twyWEEDLAUb9ESNco0SHEQhzH4dprr8W1116L5cuXIyQkBJs3b4ZEIoFWqzU6Nj4+Hps2bYKvry/c3Ny6fMzjx4+jpaUFLi4uAICDBw9CoVBgyJAhNn0thBBCnB/1S4SYRlPXCLHAoUOH8NZbb+HIkSMoLCzEjz/+iIqKCkRGRiI0NBQnTpxAbm4uKisrodFoMG/ePHh7e2PGjBnYt28f8vPzkZ6ejsceewwXL140PK5arcbChQtx6tQp/PLLL3jllVewZMkSmgdNCCGkW9QvEdI1GtEhxAJubm7Yu3cv1q5di/r6eoSEhGD16tWYNm0axo4di/T0dIwdOxaNjY3YvXs3Jk6ciL179+K5557DrFmz0NDQgMGDByM5Odnom7Tk5GSEh4fjhhtugEqlwty5c/Hqq6/a74USQghxCtQvEdI1jjHG7B0EIVezBQsWoLa2Flu2bLF3KIQQQgj1S2TAoPFHQgghhBBCyIBDiQ4hhBBCCCFkwKGpa4QQQgghhJABh0Z0CCGEEEIIIQMOJTqEEEIIIYSQAYcSHUIIIYQQQsiAQ4kOIYQQQgghZMChRIcQQgghhBAy4FCiQwghhBBCCBlwKNEhhBBCCCGEDDiU6BBCCCGEEEIGHEp0CCGEEEIIIQPO/wdLwN7rLV0F0wAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=1000):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    last_step = train_df.index[-1] # 最后一步的步数\n",
    "    # print(train_df.columns)\n",
    "    print(train_df['acc'])\n",
    "    print(val_df['acc'])\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns) # 画几张图,分别是损失和准确率\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        # print(train_df[item].values)\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid() # 显示网格\n",
    "        axs[idx].legend() # 显示图例\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000)) # 设置x轴刻度\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, last_step, 5000))) # 设置x轴标签\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record)  #横坐标是 steps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:17:16.674099900Z",
     "start_time": "2024-07-17T03:17:14.333157800Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3578\n",
      "accuracy: 0.8700\n"
     ]
    }
   ],
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "model.eval() # 进入评估模式\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
